我对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>
一个想法?
答案 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 $],则不是 做出任何改变都是必要的。