我有一个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进行验证,然后得到以下错误:
模式有效性错误:元素'A':facet‘模式’值'2>1‘不被模式’^<>接受。 模式有效性错误:元素'B':facet‘模式’‘值'0<1’不被模式'^<>‘接受
每个人都可以看到,在元素<和B中没有>或A。我有2>1和0<1。在xmllint验证xml之前,它将2>1传输到2>1,0<1传输到0<1,然后验证并报告它们是不正确的!
如何让字符串"2>1"和"0<1"传递一个模式,该模式要求字符串不应该小于或大于符号?
发布于 2017-05-15 16:23:51
这是最新的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解析器已经发布了一个错误,涉及到的任何文字<符号都不是开始标记的一部分。
https://stackoverflow.com/questions/43979660
复制相似问题