【发布时间】:2015-05-29 08:11:28
【问题描述】:
我有多个 Xsd 架构文件(小文件)并想以某种方式将它们组合成一个大文件,我正在考虑一个 xml 文件,其中每个 Xsd 架构内容有 1 个节点,在 C# 代码中选择相应的部分和验证反对它。 问题是我可以在使用 Visual Studio 打开 Xml 文件时看到警告“全局元素 'xxx' 已被声明。”(我绝对不是 Xsd 专家;我确实重复了相同的元素)。
对这种方法的正确性有任何想法吗? 我应该将 CData 用于 Xsd 内容吗?
Xml 文件示例:
XML 1:
<resource xmlns="">
<identifier>5401902302111</identifier>
<product>printer</product>
<requestedby />
</resource>
Xml 2:
<resource xmlns="">
<identifier>5401902302112</identifier>
<email>someone@em.com</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 文档。
-
您只显示 一个 XSD 文档 - 所有其他都不是架构文件。完全不清楚你在问什么。
-
我同意马蒂亚斯的观点。然而,这是一种有趣的方法,其动机可能更多是出于误解,而不是要求偏离标准验证实践的特定要求。除非你有具体的、令人信服的理由走这条路,否则我建议你去做more conventionally。
标签: xml xsd xsd-validation