gpt4 book ai didi

java - 获取给定 XSD 类型的所有 XML 节点

转载 作者:行者123 更新时间:2023-12-02 02:47:42 25 4
gpt4 key购买 nike

我想获取给定 XSD 类型的所有 XML 节点。

例如(请参阅下面的代码片段)

  • 对于 XSD 类型 ListA,它应该只能找到 1 个节点 - MyLists/MyListA
  • 对于 XSD 类型 ItemType,它应该找到 4 个节点 - 2x MyLists/MyListA/ItemA 和 2x MyLists/MyListB/ItemB,但是不是 MyLists/MyListC/内的节点,因为它们是 CustomItemType 的类型(尽管它们具有相同的名称 - 类型不同)。

有没有一个java库可以提供这个功能?

或者有什么想法可以手动解决这个问题吗? XSD 可能非常复杂,需要导入其他架构等。我正在考虑通过遍历 XSD 模式(不会有递归)来生成所有可能的到给定类型节点的 xPath,然后将它们应用到 XML 文件并检查是否找到了一些节点。

XSD 示例

<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>


<xs:complexType name="ListA">
<xs:sequence>
<xs:element name="ItemA" type="ItemType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="ListB">
<xs:sequence>
<xs:element name="ItemB" type="ItemType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="AnotherList">
<xs:sequence>
<xs:element name="ItemA" type="CustomItemType" maxOccurs="unbounded"/>
<xs:element name="ItemB" type="CustomItemType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="ItemType">
<xs:sequence>
<xs:element name="ID" type="xs:string" />
<xs:element name="Value" type="xs:string" />
</xs:sequence>
</xs:complexType>

<xs:complexType name="CustomItemType">
<xs:sequence>
<xs:element name="ID" type="xs:string" />
<xs:element name="Value" type="xs:string" />
</xs:sequence>
</xs:complexType>

<xs:element name="MyLists">
<xs:complexType>
<xs:sequence>
<xs:element name="MyListA" type="ListA" />
<xs:element name="MyListB" type="ListB" />
<xs:element name="MyListC" type="AnotherList" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

XML 示例

<MyLists>
<MyListA>
<ItemA>
<ID>1</ID>
<Value>A1</Value>
</ItemA>
<ItemA>
<ID>2</ID>
<Value>A2</Value>
</ItemA>
</MyListA>
<MyListB>
<ItemB>
<ID>1</ID>
<Value>B1</Value>
</ItemB>
<ItemB>
<ID>2</ID>
<Value>B2</Value>
</ItemB>
</MyListB>
<MyListC>
<ItemA>
<ID>1</ID>
<Value>A1</Value>
</ItemA>
<ItemB>
<ID>2</ID>
<Value>B1</Value>
</ItemB>
</MyListC>
</MyLists>

最佳答案

您可以使用模式感知 XPath 2.0 或更高版本或模式感知 XQuery 1.0 或更高版本,通过使用 //element(*, YourGlobalTypeName) ( https://www.w3.org/TR/xpath20/#prod-xpath-ElementTest ) 等测试来解决该问题,因此在您的示例中,测试 //element(*, ListA) 返回一个元素,而 //element(*, ItemType) 返回四个元素。在Java世界中,Saxon 9 EE支持模式感知XPath 2.0/3.0/3.1和XQuery 1.0/3.0/3.1,还有各种XQuery实现,例如exist-db或basex,但我不确定它们是否支持模式感知XQuery。

关于java - 获取给定 XSD 类型的所有 XML 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44343598/

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