XmlSchemaValidationException: элемент 'B' не объявлен - PullRequest
4 голосов
/ 06 января 2012

Я использую XmlReader для проверки Xml на Xsd.

Когда я проверяю этот xml

<?xml version="1.0" encoding="utf-8" ?>
<A><B>sdf</B></A>

против этой схемы:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="B" type="xs:string" />

<xs:element name="A">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="B"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

</xs:schema>

проверка в порядке.

Но если я добавлю пространство имен:

<?xml version="1.0" encoding="utf-8" ?>
<A xmlns="myns"><B>sdf</B></A>

и соответствующая схема:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns">

<xs:element name="B" type="xs:string" />

<xs:element name="A">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="B"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

</xs:schema>

Я принимаю System.Xml.Schema.XmlSchemaValidationException: элемент 'B' не объявлен. Почему это происходит? И как я могу добавить пространство имен?

1 Ответ

5 голосов
/ 06 января 2012

Причина, по которой вы получаете ошибку проверки, состоит в том, что ваша схема на самом деле является двумя схемами. У вас есть два корневых элемента, A и B. Корневой элемент не может быть неявно использован как тип. Вам нужно сообщить XSD, что вы хотите использовать типы из другой схемы (используя импорт), или сделать эти типы локальными для схемы (используя определение complexType).

Пример : извлечь B в его собственную схему. Он не может использовать одно и то же пространство имен:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns2">
  <xs:element name="B" type="xs:string" />
</xs:schema>

Затем вы можете ссылаться на B из вашего типа A, используя import:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns" xmlns:myns2="myns2">

  <xs:import namespace="myns2" />

  <xs:element name="A">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="myns2:B" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Это позволяет вам иметь следующий действительный экземпляр XML:

<?xml version="1.0" encoding="utf-8" ?>
<A xmlns="myns">
  <B xmlns="myns2">sdf</B>
</A>

Причина, по которой вы смогли проверить версии типов, не относящиеся к пространству имен, заключалась в том, что для того, чтобы быть действительным XML, необходимо быть верным две вещи:

  • Хорошо сформированный XML
  • Должен соответствовать любым ссылочным типам схем

В XML-файле, не принадлежащем пространству имен, по определению нет ссылок на какие-либо типы схем, поэтому документ является допустимым XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...