c#XDocument带有字符$的Xsd模式验证

时间:2012-02-14 09:25:45

标签: validation xsd design-patterns

我对c#XDocument XSD验证有疑问。

以下文件由Xml Spy验证,但不是.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 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

只是添加到现有答案。这实际上是W3C规范的.Net实现中已知的“错误”(在Connect上已确认为here,但无法修复)。

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

  

万维网联盟(W3C)的System.Xml实现   XML Schema的建议使用RegEx类来执行   正则表达式的模式匹配。在某些情况下,行为   W3C推荐的不同于RegEx类的行为。该   以下是System.Xml实现的已知情况   模式匹配与W3C规范不同:

     

根据W3C for XML Schema规范,美元符号($)   应被视为常规角色。但是,System.Xml   验证将xs:pattern中的美元符号解释为   终点锚。可能的解决方法是用[$]替换$。   如果您的模式已经在括号中,例如[abc $],则不是   做出任何改变都是必要的。