Создайте XSD, который соответствует любому элементу без атрибутов и дочерних элементов - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть требование создать файл XSD для безопасной обработки получаемого нами XML.XML будет выглядеть следующим образом:

<Books>
  <Book>
    <abc>hello</abc>
    <xyz>crazy</xyz>
    <q123>world</q123>
    ...
  </Book>
  <Book>
    <abc>bye</abc>
    <xyz>bye</xyz>
    <q123></q123>
    ...
  </Book>
</Books>
  • Элемент <Books> является корневым элементом, поэтому будет только один.
  • Элемент <Book> встречается от 1 до100.

Проблема с подэлементами элемента <Book>.

  • Вхождение должно быть от 1 до 500.
  • подэлементами может быть любое имя.
  • Имя должно быть длиной от 1 до 100 символов.
  • Они могут быть в любом порядке.
  • Подэлементне может иметь никаких атрибутов.
  • Значение подэлемента может быть длиной от 0 до 100 символов.

Хорошая новость: каждый элемент <Book> будет иметь одинаковое число и одинаковый порядок.субэлементов.Ниже XSD, который у меня есть.Это основано на ответе XSD для переменных имен элементов

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
  <xs:element name="Books">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Book" minOccurs="0" maxOccurs="1000">
          <xs:complexType>
            <xs:sequence>
              <xs:any processContents="strict" namespace="##local" minOccurs="0" maxOccurs="500"/>
            </xs:sequence>
            <xs:assert test="every $e in * satisfies matches(local-name($e), '.{1,100}')"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Когда я пытаюсь проанализировать XML, я получаю эту ошибку: The 'http://www.w3.org/2001/XMLSchema:assert' element is not supported in this context.

Я не уверен, почему я получаю эту ошибку.Также я понятия не имею, как проверить, что значение подэлемента находится в диапазоне от 0 до 100 символов, и как убедиться, что у него 0 атрибутов.

Я работаю в C # .NET 4.6.Заранее спасибо!

...