【问题标题】:Parsing XSD to tree structure将 XSD 解析为树结构
【发布时间】:2018-05-03 19:34:36
【问题描述】:

这是来自 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 架构。

我知道有一些库和工具可以做到这一点。

但我想手动制作(按每个元素添加树节点),以便我可以轻松获取每个元素信息并提供树视图。

这是 coma 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 相似度,第一件事是得到结构相似度。

如果我能得到树模式并知道每个元素的位置和关系,我认为计算结构相似性会很容易。

如何使用解析结果构造树?

方法?想法?

任何帮助将不胜感激。

【问题讨论】:

    标签: java swing tree xsd xsom


    【解决方案1】:

    您可以使用DOM(请参阅JAXP)将 XML Schema 表示为树,然后在树上工作以构建树。

    您还可以使用 JAXB 将架构转换为 Java 并从那里使用对象。

    您说您想使用“手动”操作来理解 XML Schema?那么也许您可以尝试使用SAXStAX 编写它。您必须在读取每个节点时处理它,并在读取时构建树表示。

    我有一个 Java SAX 示例可以给你看。我会尝试根据您的问题对其进行调整,然后将其添加到此处。

    这里是:https://gist.github.com/helderdarocha/8791651(这应该适用于您的示例,但不适用于任何其他 XML Schema;DOM 将是一个更简单的选择,如果您认真对待处理 Schema,我建议您尝试 JAXB)

    【讨论】:

    • 谢谢你的建议!我试过JAXB来做这个工作,但我认为JAXB主要是处理对象类。我的目的是计算xsd相似度,首先是得到结构相似。我认为如果我能得到树模式并知道每个元素的位置和它的关系,那么计算结构相似性会很容易。我能问你示例中的命名空间导入了什么吗?我的 IDE 出了点问题。
    • 对于几个 SAX 类,您需要 org.xml.sax.*javax.xml.parsers.*,还需要 org.xml.sax.helpers.DefaultHandler
    • 你会如何关注参考文献?
    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    相关资源
    最近更新 更多