#c# #xml #xsd #schema
Вопрос:
У меня есть набор xsd-файлов, которые я пытаюсь использовать для проверки xml — файла на C#. Сообщение об ошибке, которое я получаю, выглядит так
Необработанное исключение. System.Xml.Схема.Исключение XmlSchemaValidationException: Неопределенный сложный тип «Пространство имен:CDSInterchange_Структура» используется в качестве основы для расширения сложного типа.
CDSInterchange_Structure
используется в качестве расширения в root.xsd и определен в 000.xsd, но я не уверен, почему я получаю неопределенную ошибку, поскольку я включаю файл .xsd в root.xsd
root.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="myNamespace" targetNamespace="myNamespace" elementFormDefault="qualified" attributeFormDefault="unqualified" version="6-2" id="XML_Message-V6-1-1-2010-12-10">
<xs:include schemaLocation="Structures.xsd"/>
<xs:include schemaLocation="000.xsd"/>
<xs:element name="CDS-XMLInterchange" id="CommissioningDataSetInterchange">
<xs:complexType>
<xs:complexContent>
<xs:extension base="CDSInterchange_Structure">
<xs:attribute name="SchemaVersion" type="xs:NMTOKEN" use="required" fixed="6-2">
</xs:attribute>
<xs:attribute name="SchemaDate" type="xs:date" use="required" fixed="2012-05-11">
</xs:attribute>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:schema>
000.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns="myNamespace" targetNamespace="myNamespace" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:include schemaLocation="Structures.xsd"/>
<xs:complexType name="CDSInterchange_Structure" mixed="false">
<xs:sequence>
<xs:element name="CDSInterchangeHeader" type="ns:CDSInterchangeHeader_Structure"/>
<xs:element name="CDSNetChange-All-MessageTypes" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="CDSMessageHeader" type="ns:CDSMessageHeader_Structure"/>
<xs:element name="CDSTransactionHeader_NetChange" type="ns:CDSTransactionHeader_NetChange_Structure"/>
<xs:element name="CDSMessageTrailer" type="ns:CDSMessageTrailer_Structure"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CDSInterchangeTrailer" type="ns:CDSInterchangeTrailer_Structure"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Есть третий файл, на который ссылаются, называемый Structures.xsd, который я не включил, так как он даже не зашел так далеко. Вот код проверки C#, который я использую:
public static bool XmlSchemaValidation(string xml, string xsdFilePath)
{
ValidatorLog.Clear();
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(null, xsdFilePath);
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler = new ValidationEventHandler(SettingsValidationEventHandler);
using (var stream = StreamFromString(xml))
{
XmlReader reader = XmlReader.Create(stream, settings);
while (reader.Read()) { }
}
if (ValidatorLog.Errors > 0 || ValidatorLog.Warnings > 0)
{
ValidatorLog.GenerateLogtxt();
Console.WriteLine(DateTime.Now.ToString("yyyyMMdd HH:mm:ss") $" - {xsdFilePath} schema validation failed. {ValidatorLog.Errors} errors and {ValidatorLog.Warnings} warnings.");
string dateTime = DateTime.Now.ToString("yyyyMMdd-HHmmss");
File.WriteAllText($@"{Path.GetDirectoryName(xsdFilePath)}log{dateTime}_Validation_log.txt", ValidatorLog.Logtxt);
return false;
}
else
{
return true;
}
}
static void SettingsValidationEventHandler(object sender, ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Warning)
{
ValidatorLog.Messages.Add("WARNING: " e.Message Environment.NewLine);
ValidatorLog.Warnings ;
Console.WriteLine("WARNING: " e.Message);
}
else if (e.Severity == XmlSeverityType.Error)
{
ValidatorLog.Messages.Add("ERROR: " e.Message Environment.NewLine);
ValidatorLog.Errors ;
Console.WriteLine("ERROR: " e.Message);
}
}
Любая помощь очень ценится, я не очень хорошо разбираюсь в xml.
Комментарии:
1. Убедитесь, что пространства имен xml-файлов указывают на те же xsd-файлы, которые вы используете. XML, вероятно, использует расположение HTTP, пока ваши схемы находятся на локальном диске.