Ошибка проверки XML с использованием вложенной схемы XSD - тип не объявлен - PullRequest
5 голосов
/ 21 сентября 2011

Я использую вложенную схему XSD для проверки XML-документа. Импортированные XSD-файлы используют собственные целевые пространства имен, и я могу проверить приведенный ниже пример XML-файла с помощью Liquid XML Studio. Но когда я запускаю проверку, используя мой код C # ниже, она завершается ошибкой объявления типа (см. Ниже). Я потратил много времени, пытаясь понять, но не повезло:

Основная схема XSD (DataItem.xsd):

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:DataNumeric="Doc.DataNumeric" xmlns:DataYesNo="Doc.DataYesNo"  attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import schemaLocation="DataNumeric.xsd" namespace="Doc.DataNumeric" />
  <xs:import schemaLocation="DataYesNo.xsd" namespace="Doc.DataYesNo" />
  <xs:complexType name="tDataItem">
      <xs:choice>
        <xs:element name="DataNumeric" type="DataNumeric:tDataNumeric" />
        <xs:element name="DataYesNo" type="DataYesNo:tDataYesNo" />
      </xs:choice>
  </xs:complexType>
  <xs:element name="DataItem" type="tDataItem" />  
</xs:schema>

Включенная схема XSD (DataNumeric.xsd):

**<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:DataNumeric="Doc.DataNumeric" elementFormDefault="qualified" targetNamespace="Doc.DataNumeric" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="tDataNumeric">
    <xs:sequence>
      <xs:element name="Answer" type="xs:double" />
    </xs:sequence>
  </xs:complexType>
  <xs:element name="DataNumeric" type="DataNumeric:tDataNumeric" />
</xs:schema>**

XML:

<DataItem>
  <DataNumeric xmlns:DataNumeric="Doc.DataNumeric">
    <DataNumeric:Answer>37.8</DataNumeric:Answer>
  </DataNumeric>
</DataItem>

Ошибка проверки:

XmlSchemaValidationException: Тип «Doc.DataNumeric: tDataNumeric» не объявлен.

C # Код проверки:

XDocument xDoc = XDocument.Parse(xxxxxxx);
string xsdPath = ConfigUtils.GetXsdPath(XsdSchemaIdentifier.HHDataItem);
FileStream fs = new FileStream(xsdPath, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", reader);
fs.Close();
fs.Dispose();

xDoc.Validate(xss, null);

Ответы [ 2 ]

5 голосов
/ 22 сентября 2011

Я обнаружил проблему после срыва и полутора итераций. Изменение:

FileStream fs = new FileStream(xsdPath, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", reader);

до

XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", xsdPath);

решил проблему. Однако я все еще ищу ответ на ПОЧЕМУ? Оба являются допустимыми способами добавления схемы в набор схем (т.е. 2 перегрузки).

1 голос
/ 29 января 2016

arootbeer прав насчет того, как ваш xsd импортирует другой xsd. Однако другое решение - сначала добавить импортированный xsd в XmlSchemaSet, а затем добавить xsd, выполняющий фактический импорт.

//Xsd file that is being imported
FileStream importedXsdStream = new FileStream(importedXsdPath, FileMode.Open);
XmlReader xmlReader = XmlReader.Create(importedXsdStream);
XmlSchemaSet xmlSchemaSet = new XmlSchemaSet();
xmlSchemaSet.Add("NameSpace.SomeNameSpace", xmlReader);

//Your code
FileStream fs = new FileStream(xsdPath, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", reader);

Обратите внимание, что я помещаю Пространство имен в качестве первого параметра при добавлении импортированного xsd в XmlSchemaSet. Это может быть необходимо в зависимости от того, есть ли ошибки с целевым пространством имен, не соответствующим пространству имен, предоставленному в импортированном xsd.

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