gpt4 book ai didi

xml - 使用 XSD 验证 XML 元素

转载 作者:行者123 更新时间:2023-12-05 08:01:34 25 4
gpt4 key购买 nike

我有以下 XML:

<?xml version="1.0" encoding="utf-8"?>
<MainElement>
<id>1</id>
<name>John</name>
<custom>
<age>43</age>
<sex>male</sex>
</custom>
</MainElement>

还有另一个 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<MainElement>
<id>2</id>
<name>Dave</name>
<custom>
<age>51</age>
<county>England</country>
<city>London</city>
</custom>
</MainElement>

两个 XML 文件的主要结构只有 <custom> 相同。元素有不同的实现。我已经有一个 XSD 文件来检查元素,如“id”和“name”,其中 <custom>元素的类型为 xs:anyType。是否可以创建另一个仅验证 <custom> 的 XSD 文件元素而不查看所有其他存在的元素?

最佳答案

我将为两个客户进行说明。第一个 XSD 是基础的,它应该捕获所有公共(public)部分,除了我们引用但未定义的 custom;我们让它“悬空”。

下面是common.xsd:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="MainElement">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="id" type="xsd:unsignedByte" />
<xsd:element name="name" type="xsd:string" />
<xsd:element ref="custom"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

然后我们开始为每个 custom 定义一个 XSD。对于第一个 XML (custom-1.xsd):

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="custom">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="age" type="xsd:unsignedShort"/>
<xsd:element name="sex" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

对于第二个,custom-2.xsd:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="custom">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="age" type="xsd:unsignedShort"/>
<xsd:element name="country" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

然后您必须通过适当加载 XSD 为每个客户创建一个模式集:第一个集将包括 common + custom-1,然后是 common + custom-2,等等。

这就是我使用 QTAssistant“可视化”这些集合的方式:

enter image description here

当然,Common 本身是无效的。

Error occurred while loading [file:///.../validate-xml-element-with-xsd-2.xsd], line 9 position 10.
The 'custom' element is not declared.

但是,每个其他集合都是有效的,因为集合中的附加 XSD 将缺少的定义纳入范围。现在您可以验证每个供应商的 XML 及其关联集。您维护了供应商之间公共(public)定义的完整性,因为您确实共享一个公共(public) XSD,并且您可以使用悬挂定义摆脱 XSD 1.0 中的“限制”。我认为这并不是真正的限制;这可能是一种“不太优雅”的方法......

从处理的角度来看,您会产生与供应商一样多次编译和加载通用 XSD 的开销。

如果这成为一种负担,您还可以使用另一种策略,一旦预处理 XML 的返回得到返回。您可以将 custom 定义为 anyType,甚至可以将其替换为 xsd:any。一旦您验证了共同点,您就可以提取节点(XSLT 或 DOM API 或 DOM 节点阅读器之上的验证阅读器等)并使用适当的 XSD 独立验证它。

后一种方法的优点是您不会在 XSD 方面有任何开销。当然,权衡可能会增加处理过程中的足迹。

XSD 1.1、XSD 1.0 + Schematron、RelaxNG 是涉及另一种模式语言的解决方案,它们各有优缺点。我认为以上内容至少应该可以帮助您了解您拥有的一些选项...

关于xml - 使用 XSD 验证 XML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13160966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com