通过 XSD 在 XML 中验证小于 (<) 和大于 (>)?

Validating less than (<) and greater than (>) in XML via XSD?

我有这个XML:

<?xml version="1.0" encoding="utf-8"?>
<data>
  <A>2&gt;1</A>
  <B>0&lt;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="[^&lt;&gt;]+" />
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="B">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:pattern value="[^&lt;&gt;]+" />
          </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 '[^<>]'

如大家所见,我在元素AB中没有<>。我有 2&gt;10&lt;1。 在 xmllint 验证 xml 之前,它将 2&gt;1 传输到 2>1 并将 0&lt;1 传输到 0<1,然后验证并报告它们不正确!

如何让字符串 "2&gt;1""0&lt;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+[&lt;&gt;]\d+" />
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

将验证您的 XML、

<?xml version="1.0" encoding="utf-8"?>
<data>
  <A>2&gt;1</A>
  <B>0&lt;1</B>
</data>

成功。


也就是说,您似乎试图在 XSD 级别区分 <&lt;(以及 >&gt;) .无论如何,这对于任何合理的要求都是不可能或不需要的。 XML 解析器将在验证之前进行这些替换。此外,作为其格式检查的一部分,XML 解析器已经针对遇到的任何不属于开始标记的文字 < 符号发出错误。