2012-02-14 65 views
5

我遇到了c#XDocument XSD驗證問題。

下面的文件是由XML間諜驗證很好,但不是。NET(C#)

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Simple.xsd"> 
    <Var Name="$Toto"/> 
</Root> 

架構

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="Root"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Var"> 
        <xs:complexType> 
         <xs:attribute name="Name" type="ST_VariableIdentifier" use="required"/> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
     <xs:simpleType name="ST_VariableIdentifier"> 
     <xs:restriction base="xs:string"> 
      <xs:pattern value="$[a-z,A-Z]*"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

的想法?

+2

會受益於C#標記嗎? – sbi 2012-02-14 10:15:28

+0

這是C#中的一個錯誤,有一個解決方法:使用[$]。不要打擾嘗試這樣的字符引用,例如$,由於某種原因C#在這裏非常挑剔... – 2012-02-14 12:15:24

回答

4

這應該工作!

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="Root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Var"> 
      <xs:complexType> 
      <xs:attribute name="Name" type="ST_VariableIdentifier" use="required"/> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:simpleType name="ST_VariableIdentifier"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="[$][a-z,A-Z]*"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 
+0

謝謝,它運行良好。 – swWork 2012-02-14 13:20:07

+0

歡迎您:) – 2012-02-14 13:23:37

+0

請接受答案,如果它真的是您的解決方案:)謝謝。 – 2012-02-14 13:24:23

0

只是添加到現有的答案。這實際上是W3C規範的.Net實現中的一個已知「bug」(在Connect上承認here,但不會修復)。

MSDN提供了更多信息(here)以及上述解決方法。

對System.Xml實現萬維網聯盟(W3C) 的XML架構建議使用正則表達式類來執行 正則表達式的模式匹配。在某些情況下,W3C推薦的行爲 與RegEx類行爲不同。該 以下是已知的情況下的 模式匹配的System.Xml執行從W3C規範的區別:

根據W3C的XML Schema規範,美元符號($) 應該被視爲常規字符。但是,System.Xml 驗證將xs:pattern中的美元符號解釋爲 行尾錨點。可能的解決方法是用$替換$。 如果您的模式已經在方括號中,例如[abc $],那麼進行任何更改都不是 。