#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:
- Добавьте пространство имен по умолчанию в свой XML, чтобы оно соответствовало XSD
targetNamespace.
- Измените
ref="Product"
ссылку в вашем XSD, чтобы включить префикс пространства имен для XSDtargetNamespace
.
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;