我有多个Xsd模式文件(小的),并想以某种方式将它们合并到一个大文件中,我想在C#代码中选择相应的部分并对其进行验证,每个Xsd模式内容都有一个节点。问题是,我可以看到一个警告“全局元素'xxx‘已经声明了。”当使用Visual打开Xml文件时(我肯定不是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内容)
谢谢
发布于 2015-04-19 01:20:37
与其他人不同的是,我认为您的问题的唯一问题是,它未能说明为什么要像您所描述的那样创建XML文件格式。事实上,我参与了一个有趣的讨论,在这里所以,C. M. Sperberg-McQueen甚至为这个讨论组织了一个演示,最后得出结论:
因此,它说明可以在同一个XML文档中嵌入多个符合规范的模式文档。(由于这似乎是一些感兴趣的方面的问题,显然还应该注意到WSDL在这里没有涉及到。)
我觉得有必要链接C.M.Sperberg-McQueen的答案,因为您说了,我想的是xml文件,而不是XSD文件(这将是kjhughes点)。
我认为您没有给出一个很好的场景,因为下面的单个模式将很好地满足您的XML。
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="resource">
<xs:complexType>
<xs:sequence>
<xs:element name="identifier" type="xs:unsignedLong"/>
<xs:choice>
<xs:element minOccurs="0" name="email" type="xs:string"/>
<xs:sequence>
<xs:element minOccurs="0" name="product" type="xs:string"/>
<xs:element minOccurs="0" name="requestedby" type="xs:string"/>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
让我们来看看一些场景(如果您有其他问题,请更新您的问题):
对于后者,我建议采取一种稍微不同的方法。我将使用XInclude将XSD连接到一个文件中--如果这是您的处理模型所需要的;有一个网络库这里。这将允许独立地编写XSD,从而确保每个XSD都是有效的,并使用通用编辑器(包括Visual )。
发布于 2015-03-25 16:46:41
与其发明自己的、临时的组合XSD的方法,不如使用基于xsd:包括或xsd:导入的标准方法。
另见:xsd:include和xsd:import之间有什么区别?
而且,除非您有非常具体的理由使用代码中的特殊方法分派验证,否则应该在文档级别进行验证,并让解析器为您定位适当的声明。
https://stackoverflow.com/questions/29259349
复制相似问题