我有一个XSD文件,里面有很多元素。对于该XSD文件的一部分,我需要验证传入的XML文件。
例如:
这是有效的 XML
<in attr1="9" attr2="0" attr3="0" />
这是 XSD 文件。只有元素"FindPerson"下名为"In"的元素是验证XML文件所必需的。
<xs:element name="WS">
<xs:complexType>
<xs:sequence>
<xs:element name="ELEMENT1">
<xs:complexType>
<xs:sequence>
<xs:element name="FindPerson">
<xs:complexType>
<xs:sequence>
<xs:element name="In">
<xs:complexType>
<xs:attribute name="attr1" type="xs:int"/>
<xs:attribute name="attr2" type="xs:boolean" use="optional" default="0"/>
<xs:attribute name="attr3" type="xs:boolean" use="optional" default="0"/>
</xs:complexType>
</xs:element>
...
有没有办法在 C# 中仅使用部分 XSD 文件来验证 XML 文件?
这实际上可以通过您进行一些工作来实现,并假设您的 XSD 确实是使用俄罗斯娃娃样式(所有内容嵌套)创作的,正如您截断的 XSD 所暗示的那样。
一个简单的方法是按照以下步骤操作:
- 将原始 XSD 读取为纯 XML 文件;使用 XPath 找到要使用的节点,并保留它。
- 创建一个新的 XML 文档; 创建文档元素作为模式,具有适当的命名空间; 为具有适当值的 targetNamespace 创建(或不创建)属性; 元素表单默认相同;
- 深层克隆并在上面创建的架构元素下复制 In 节点定义
- 从新创建的文档元素节点创建 XmlNodeReader。
- 使用 XmlSchema.Read(nodeReader) 读取架构
- 使用 XmlSchemaSet 进行编译;如果成功,请使用该架构集进行验证。
这里的想法是在内存中创建飞行中所需的架构。如果内容模型更复杂(不是俄罗斯娃娃),那么事情很容易复合到不可行的地步。
您需要重组 XSD。 使所有元素成为同级元素(在顶层)。使用 element ref=...
在定义它们的关系时从另一个引用一个。 然后,您的 XSD 将能够验证任何顶级元素。