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

时间:2017-05-15 12:31:22

标签: xml xsd xsd-validation xml-validation xmllint

我有这个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进行验证,然后我收到了这个错误:

  

架构有效性错误:元素&#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;

不接受

每个人都可以看到,我在元素<>中没有AB。我有2&gt;10&lt;1。 在xmllint验证xml之前,它会将2&gt;1传输到2>1并将0&lt;1传输到0<1,然后验证并报告它们不正确!

如何让字符串"2&gt;1""0&lt;1"传递一个模式,该模式请求字符串不应小于或大于符号?

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+[&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解析器已经发出了关于遇到的任何文本<符号的错误,这些符号不是开始标记的一部分。