2014-02-03 2 views
0

Вот пример XML-схема, которая приходит от W3C School (shiporder.xsd)Разбор XSD в древовидную структуру

ссылки: 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)

enter image description here

Я знаю, как добавить узлы в 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

Вы можете использовать DOM (см. JAXP), чтобы получить представление XML-схемы как дерева, а затем работать с деревом для построения дерева.

Вы также можете использовать JAXB для преобразования Схемы в Java и оттуда на использование объектов.

Вы говорите, что хотите использовать манипулировать им «вручную», чтобы понять XML-схему? Тогда, возможно, вы могли бы попытаться написать его, используя SAX или StAX. Вам придется иметь дело с каждым узлом, поскольку он читается и создает представление дерева во время чтения.

У меня есть пример Java SAX, который я могу вам показать. Я попытаюсь приспособить его к вашей проблеме, а затем добавлю его здесь.

Вот оно: https://gist.github.com/helderdarocha/8791651 (это должно работать с вашим примером, а не с какой-либо другой схемой XML, DOM будет более простой альтернативой, и если вы серьезно относитесь к обработке Schemas, я предлагаю вам попробовать JAXB)

+0

спасибо за ваше предложение! Я пробовал JAXB для выполнения этой работы, но я думаю, что JAXB в основном обрабатывает класс объекта.Моя цель - вычислить сходство xsd, и первое, что нужно, - получить сходство структуры. Я думаю, что будет легко вычислить сходство структуры, если я смогу получить схему дерева и узнать положение каждого элемента и его отношения. Могу ли я спросить вас, что импортирует имена в вашем примере? Что-то не так в моей среде IDE. – Shinline

+0

Для нескольких классов SAX вам понадобятся 'org.xml.sax. *' И 'javax.xml.parsers. *', А также 'org.xml.sax.helpers.DefaultHandler' – helderdarocha

Смежные вопросы