如何将XML转换为Java树结构?

时间:2010-03-05 02:14:41

标签: java xml

我想将XML文档转换为java-tree-structure,但我不知道什么是java-tree-structure?例如,JTree还是其他?是否存在任何图书馆?

3 个答案:

答案 0 :(得分:4)

您可以使用以Java表示的XML DOM树。 XML解析器会立即将它提供给您。

答案 1 :(得分:4)

如果您的XML符合特定模式(并且您有一个XSD文件),则可以使用JAXB将XSD转换为一堆Java类,以便于操作数据。

答案 2 :(得分:3)

您可以使用JTree中的SAXTreeBuilder结构填充import org.xml.sax。类似的东西(注意:我没有写下面的代码)

/*
  Java, XML, and Web Services Bible
  Mike Jasnowski
  ISBN: 0-7645-4847-6
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Event.*;
import java.io.*;
import javax.swing.tree.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.apache.xerces.parsers.*;

public class XMLTreeView {

       private SAXTreeBuilder saxTree = null;
       private static String file = "";

       public static void main(String args[]){
              JFrame frame = new JFrame("XMLTreeView: [ games.xml ]");
              frame.setSize(400,400);

              frame.addWindowListener(new WindowAdapter(){
                   public void windowClosing(WindowEvent ev){
                       System.exit(0);
                   }
              });
              file = "games.xml";
              new XMLTreeView(frame);
       }

       public XMLTreeView(JFrame frame){ 
              frame.getContentPane().setLayout(new BorderLayout());  
              DefaultMutableTreeNode top = new DefaultMutableTreeNode(file);
//              DefaultMutableTreeNode top = new DefaultMutableTreeNode("XML Document"); 

              saxTree = new SAXTreeBuilder(top); 

              try {             
              SAXParser saxParser = new SAXParser();
              saxParser.setContentHandler(saxTree);
              saxParser.parse(new InputSource(new FileInputStream(file)));
              }catch(Exception ex){
                 top.add(new DefaultMutableTreeNode(ex.getMessage()));
              }
              JTree tree = new JTree(saxTree.getTree()); 
              JScrollPane scrollPane = new JScrollPane(tree);

              frame.getContentPane().add("Center",scrollPane);                                           
              frame.setVisible(true);       

        } 


}
class SAXTreeBuilder extends DefaultHandler{

       private DefaultMutableTreeNode currentNode = null;
       private DefaultMutableTreeNode previousNode = null;
       private DefaultMutableTreeNode rootNode = null;

       public SAXTreeBuilder(DefaultMutableTreeNode root){
              rootNode = root;
       }
       public void startDocument(){
              currentNode = rootNode;
       }
       public void endDocument(){
       }
       public void characters(char[] data,int start,int end){
              String str = new String(data,start,end);              
              if (!str.equals("") && Character.isLetter(str.charAt(0)))
                  currentNode.add(new DefaultMutableTreeNode(str));           
       }
       public void startElement(String uri,String qName,String lName,Attributes atts){
              previousNode = currentNode;
              currentNode = new DefaultMutableTreeNode(lName);
              // Add attributes as child nodes //
              attachAttributeList(currentNode,atts);
              previousNode.add(currentNode);              
       }
       public void endElement(String uri,String qName,String lName){
              if (currentNode.getUserObject().equals(lName))
                  currentNode = (DefaultMutableTreeNode)currentNode.getParent();              
       }
       public DefaultMutableTreeNode getTree(){
              return rootNode;
       }

       private void attachAttributeList(DefaultMutableTreeNode node,Attributes atts){
               for (int i=0;i<atts.getLength();i++){
                    String name = atts.getLocalName(i);
                    String value = atts.getValue(name);
                    node.add(new DefaultMutableTreeNode(name + " = " + value));
               }
       }

}