我有这个XML:
<?xml version="1.0" encoding="utf-8"?>
<data>
<A>2>1</A>
<B>0<1</B>
</data>
我想用这个XSD验证它:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="data">
<xs:complexType>
<xs:sequence>
<xs:element name="A">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[^<>]+" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="B">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[^<>]+" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
我使用xmllint进行验证,然后我收到了这个错误:
架构有效性错误:元素&#39; A&#39;:[facet&#39;模式&#39;]值&#39; 2&gt; 1&#39; 模式不接受&#39; [^&lt;&gt;]&#39;。
架构有效性错误:元素&#39; B&#39;:[facet&#39; pattern&#39;]值&#39; 0&lt; 1&#39; 模式&#39; [^&lt;&gt;]&#39;
不接受
每个人都可以看到,我在元素<
和>
中没有A
或B
。我有2>1
和0<1
。
在xmllint验证xml之前,它会将2>1
传输到2>1
并将0<1
传输到0<1
,然后验证并报告它们不正确!
如何让字符串"2>1"
和"0<1"
传递一个模式,该模式请求字符串不应小于或大于符号?
答案 0 :(得分:0)
此更新的XSD,
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="data">
<xs:complexType>
<xs:sequence>
<xs:element name="A" type="ltGtExpType"/>
<xs:element name="B" type="ltGtExpType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="ltGtExpType">
<xs:restriction base="xs:string">
<xs:pattern value="\d+[<>]\d+" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
将验证您的XML,
<?xml version="1.0" encoding="utf-8"?>
<data>
<A>2>1</A>
<B>0<1</B>
</data>
成功。
也就是说,您似乎试图在XSD级别区分<
和<
(以及>
和>
之间)。无论如何,这对任何合理的要求都是不可能或不需要的。 XML解析器将在验证之前进行这些替换。此外,作为其良构性检查的一部分,XML解析器已经发出了关于遇到的任何文本<
符号的错误,这些符号不是开始标记的一部分。