Проверка XML-документа на соответствие XSD возвращает ошибку «элемент не объявлен».

#xml #xsd #xml-namespaces #xsd-validation #xml-validation

Вопрос:

Я пытаюсь проверить XML — документ на соответствие документу XSD.

Это мой XML:

 lt;?xml version="1.0" encoding="utf-8"?gt; lt;ArrayOfProduct xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"gt;  lt;Product IdProduct="1" NameProduct="1" PriceProduct="1" availability="1" IdSup="1" /gt; lt;/ArrayOfProductgt;  

И это мой XSD:

 lt;?xml version="1.0" encoding="UTF-8"?gt; lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/Products"gt;  lt;xs:element name="ArrayOfProduct"gt;  lt;xs:complexTypegt;  lt;xs:sequencegt;  lt;xs:element ref="Product"/gt;  lt;/xs:sequencegt;  lt;/xs:complexTypegt;  lt;/xs:elementgt;  lt;xs:element name="Product"gt;  lt;xs:complexTypegt;  lt;xs:attribute name="PriceProduct" use="required" type="xs:integer"/gt;  lt;xs:attribute name="IdSup" use="required" type="xs:integer"/gt;  lt;xs:attribute name="IdProduct" use="required" type="xs:integer"/gt;  lt;xs:attribute name="NameProduct" use="required" type="xs:integer"/gt;  lt;xs:attribute name="availability" use="required" type="xs:integer"/gt;  lt;/xs:complexTypegt;  lt;/xs:elementgt; lt;/xs:schemagt;  

И это мой код на c# :

 XmlReaderSettings ProductSettings = new XmlReaderSettings(); ProductSettings.Schemas.Add("http://www.contoso.com/Products", "XmlSchema.xsd"); ProductSettings.ValidationType = ValidationType.Schema; ProductSettings.ValidationEventHandler  = new ValidationEventHandler(ProductSettingsValidationEventHandler); XmlReader Products = XmlReader.Create(doc   ".xml", ProductSettings); while (Products.Read()) { }  

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

Элемент продукта не объявлен.

Ответ №1:

Если вы внесете эти два изменения, ваш XML будет действителен в соответствии с вашим XSD:

  1. Добавьте пространство имен по умолчанию в свой XML, чтобы оно соответствовало XSD targetNamespace.
  2. Измените ref="Product" ссылку в вашем XSD, чтобы включить префикс пространства имен для XSD targetNamespace .

XML

 lt;?xml version="1.0" encoding="utf-8"?gt; lt;ArrayOfProduct xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns="http://www.contoso.com/Products"gt;  lt;Product IdProduct="1" NameProduct="1"   PriceProduct="1" availability="1" IdSup="1" /gt; lt;/ArrayOfProductgt;  

XSD

 lt;?xml version="1.0" encoding="UTF-8"?gt; lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"  elementFormDefault="qualified"   targetNamespace="http://www.contoso.com/Products"  xmlns:p="http://www.contoso.com/Products"gt;  lt;xs:element name="ArrayOfProduct"gt;  lt;xs:complexTypegt;  lt;xs:sequencegt;  lt;xs:element ref="p:Product"/gt;  lt;/xs:sequencegt;  lt;/xs:complexTypegt;  lt;/xs:elementgt;  lt;xs:element name="Product"gt;  lt;xs:complexTypegt;  lt;xs:attribute name="PriceProduct" use="required" type="xs:integer"/gt;  lt;xs:attribute name="IdSup" use="required" type="xs:integer"/gt;  lt;xs:attribute name="IdProduct" use="required" type="xs:integer"/gt;  lt;xs:attribute name="NameProduct" use="required" type="xs:integer"/gt;  lt;xs:attribute name="availability" use="required" type="xs:integer"/gt;  lt;/xs:complexTypegt;  lt;/xs:elementgt; lt;/xs:schemagt;