Проверка правильности меньше (<) и больше (>) в XML с помощью 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 для проверки, а затем я получил эту ошибку:

Ошибка достоверности схемы: Элемент 'A': [facet 'pattern'] Значение '2>1' не принято шаблоном '[^<>]'.

Ошибка достоверности схемы: Элемент 'B': [facet 'pattern'] Значение '0<1' не принято шаблоном '[^ <>]'

Как все видят, у меня нет < или же > в стихии A а также B, я имею 2&gt;1 а также 0&lt;1, Прежде чем xmllint проверяет XML, он передает 2&gt;1 в 2>1 а также 0&lt;1 в 0<1, а затем проверяет и сообщает, что они не верны!

Как я могу позволить строку "2&gt;1" а также "0&lt;1" передать шаблон, который запрашивает, чтобы строка не имела символ меньше или больше?

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>

успешно.


Тем не менее, вы, кажется, пытаетесь различить < а также &lt; (и между > а также &gt;) на уровне XSD. Это невозможно или необходимо для каких-либо разумных требований в любом случае. Синтаксический анализатор XML выполнит эти замены до проверки. Более того, синтаксический анализатор XML уже в рамках проверки правильности сформировал ошибку, касающуюся любого литерала. < встреченные символы, которые не являются частью начального тега.

Другие вопросы по тегам