以下是来自W3C School(shiporder.xsd)
的示例xml架构参考:http://www.w3schools.com/schema/schema_example.asp
//shiporder.xsd
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="stringtype">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="inttype">
<xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>
<xs:simpleType name="dectype">
<xs:restriction base="xs:decimal"/>
</xs:simpleType>
<xs:simpleType name="orderidtype">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{6}"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="shiptotype">
<xs:sequence>
<xs:element name="name" type="stringtype"/>
<xs:element name="address" type="stringtype"/>
<xs:element name="city" type="stringtype"/>
<xs:element name="country" type="stringtype"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="itemtype">
<xs:sequence>
<xs:element name="title" type="stringtype"/>
<xs:element name="note" type="stringtype" minOccurs="0"/>
<xs:element name="quantity" type="inttype"/>
<xs:element name="price" type="dectype"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="shipordertype">
<xs:sequence>
<xs:element name="orderperson" type="stringtype"/>
<xs:element name="shipto" type="shiptotype"/>
<xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
</xs:sequence>
<xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>
<xs:element name="shiporder" type="shipordertype"/>
</xs:schema>
我使用xsom来完成这项工作。
解析后,我得到了结果
//Parsing result
//It parsed the input schema in orders and parsed the content incide when the element
//is a complex type.After finish parsing one complex element and go on next element
Element Name : shiporder
Element Type : shipordertype complex type
Element Name : orderperson
Element Type : stringtype simple type
-------------------
Element Name : shipto
Element Type : shiptotype complex type
Element Name : name
Element Type : stringtype simple type
Element Name : address
Element Type : stringtype simple type
Element Name : city
Element Type : stringtype simple type
Element Name : country
Element Type : stringtype simple type
-------------------
Element Name : item
Element Type : itemtype complex type
Element Name : title
Element Type : stringtype simple type
Element Name : note
Element Type : stringtype simple type
Element Name : quantity
Element Type : inttype simple type
Element Name : price
Element Type : dectype simple type
-------------------
Attributes for CoplexType:shipordertype
Attribute Name:orderid
Attribute Type: orderidtype
我想使用这个结果来构建JTree树,以便它可以帮助我理解xml架构。
我知道有些库和工具可以这样做。
但是我想手动创建(每个元素添加树节点),以便我可以轻松获取每个元素信息并提供树视图。
以下是昏迷3.0(shiporder.xsd)
的树视图示例
我知道如何在Jtree中添加节点
DefaultMutableTreeNode root = new DefaultMutableTreeNode("package");
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("doc1");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("doc2");
root.add(node1);
root.add(node2);
DefaultMutableTreeNode leafnode = new DefaultMutableTreeNode("doc info");
node1.add(leafnode);
我已经尝试过JAXB(DOM)来完成这项工作,但我认为JAXB主要是处理对象类。
我的目的是计算xsd相似度,首先是获得结构相似性。
我认为如果我可以获得树模式并知道每个元素的位置及其关系,那么计算结构相似性将很容易。
如何使用解析结果构建树?
方法?思想?
任何帮助将不胜感激。
答案 0 :(得分:1)
您可以使用DOM(请参阅JAXP)获取XML Schema的表示形式,然后在树上构建树。
您还可以使用JAXB将Schema转换为Java,并从那里转换为使用对象。
你说你想用它来操纵它&#34;手动&#34;理解XML Schema?那么也许您可以尝试使用SAX或StAX来编写它。在阅读时,您将不得不处理每个节点,并在阅读时构建树形表示。
我有一个可以告诉你的Java SAX示例。我会尝试根据您的问题进行调整,然后我会在此处添加。
这是:https://gist.github.com/helderdarocha/8791651(这应该适用于您的示例,但不适用于任何其他XML架构; DOM将是一个更简单的替代方案,如果您认真处理架构,我建议您尝试JAXB)