У меня есть несколько файлов схемы Xsd (маленькие) и хотелось бы каким-то образом объединить их в один большой файл, я думал о файле xml с 1 узлом для каждого содержимого схемы Xsd, в C# кода, выбирая соответствующий раздел и проверяя его. Проблема заключается в том, что я вижу предупреждение «Глобальный элемент« xxx »уже был объявлен». При открытии Xml-файла с помощью Visual studio (я определенно не эксперт Xsd, я действительно повторяю тот же самый элемент).Несколько схем Xsd в 1 файле
Любые идеи о правильности этого подхода? Должен ли я использовать CData для содержимого Xsd, может быть?
Примеры файлов XML:
Xml 1:
<resource xmlns="">
<identifier>5401902302111</identifier>
<product>printer</product>
<requestedby />
</resource>
Xml 2:
<resource xmlns="">
<identifier>5401902302112</identifier>
<email>[email protected]</email>
</resource>
XSD 1:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="resource">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:long" name="identifier"/>
<xs:element type="xs:string" name="requestedby"/>
<xs:element type="xs:string" name="product"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XSD 2:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="resource">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:long" name="identifier"/>
<xs:element type="xs:string" name="email"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
То, что я хочу, чтобы в конце концов:
*<?xml version="1.0" encoding="utf-8"?>
<resource>
<resourcedata type="acquisition">
<details>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="resource">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:long" name="identifier"/>
<xs:element type="xs:string" name="requestedby"/>
<xs:element type="xs:string" name="product"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</details>
</resourcedata>
<resourcedata type="warningletter">
<details>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="resource">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:long" name="identifier"/>
<xs:element type="xs:string" name="email"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</details>
</resourcedata>
</data>*
C# код:
var xsdContent =
xDoc.Element("resource").Elements("resourcedata")
.Where(
x =>
x.Attribute("type").Value == "acquisition")
.FirstOrDefault().Element("details").FirstNode.ToString();
var doc = new XDocument(xElementContent);
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdContent)));
Console.WriteLine("Validating doc");
bool errors = false;
doc.Validate(schemas, (o, e) =>
{
Console.WriteLine("{0}", e.Message);
Console.WriteLine("{0}", e.Exception);
errors = true;
});
Console.WriteLine("doc {0}", errors ? "did not validate" : "validated");
(xElementContent переменная содержит контент Xml)
Благодаря
Почему у вас есть несколько документов XSD, если они маленькие? Почему у вас нет единого документа схемы? Что вы подразумеваете под повторением элемента? Пожалуйста, покажите любой соответствующий код C# и минимальный образец всех файлов схемы и XML-документ, подлежащий проверке. –
Вы только показываете _one_ XSD документ - все остальные не являются файлами схемы. Полностью неясно, о чем вы спрашиваете. –
Я согласен с Матиасом. Это интересный подход, который, однако, может быть мотивирован больше недоразумением, чем конкретные требования, требующие отклонения от стандартных методов проверки. Если у вас нет конкретных, убедительных причин для перехода по этому пути, я предлагаю вам делать вещи [более условно] (http://stackoverflow.com/a/29261615/290085). – kjhughes