通过 XSD 在 XML 中验证小于 (<) 和大于 (>)?
Validating less than (<) and greater than (>) in XML via XSD?
我有这个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 进行验证,然后出现此错误:
Schemas validity error: Element 'A': [facet 'pattern'] The Value '2>1'
is not accepted by the pattern '[^<>]'.
Schemas validity error: Element 'B': [facet 'pattern'] The Value '0<1'
is not accepted by the pattern '[^<>]'
如大家所见,我在元素A
和B
中没有<
或>
。我有 2>1
和 0<1
。
在 xmllint 验证 xml 之前,它将 2>1
传输到 2>1
并将 0<1
传输到 0<1
,然后验证并报告它们不正确!
如何让字符串 "2>1"
和 "0<1"
传递一个模式,要求字符串不能有小于或大于符号?
已更新 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 解析器已经针对遇到的任何不属于开始标记的文字 <
符号发出错误。
我有这个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 进行验证,然后出现此错误:
Schemas validity error: Element 'A': [facet 'pattern'] The Value '2>1' is not accepted by the pattern '[^<>]'.
Schemas validity error: Element 'B': [facet 'pattern'] The Value '0<1' is not accepted by the pattern '[^<>]'
如大家所见,我在元素A
和B
中没有<
或>
。我有 2>1
和 0<1
。
在 xmllint 验证 xml 之前,它将 2>1
传输到 2>1
并将 0<1
传输到 0<1
,然后验证并报告它们不正确!
如何让字符串 "2>1"
和 "0<1"
传递一个模式,要求字符串不能有小于或大于符号?
已更新 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 解析器已经针对遇到的任何不属于开始标记的文字 <
符号发出错误。