包含嵌套的标签

问题描述:

XML解析XML:包含嵌套的标签

<Node name="1"> 
    <Node name="2"> 
     <Node name="4"></Node> 
    </Node> 
    <Node name = "3"> 
     <Node name="5"></Node> 
    </Node> 
</Node> 

我想在java中

Node{ 
String name; 
List<Node> nodeList 
} 

创建下列对象是否有任何的XML解析库,它可以做到这一点。 我已经尝试过Xstream和简单的,但一直没能弄明白。

任何帮助,将不胜感激。

+0

我还没有使用jaxb多年,但它会在这里工作吗? – digitaljoel

此代码使用XStream并生成您正在查找的输出。

节点类:

import java.util.ArrayList; 
import java.util.List; 

import com.thoughtworks.xstream.annotations.XStreamAlias; 
import com.thoughtworks.xstream.annotations.XStreamAsAttribute; 
import com.thoughtworks.xstream.annotations.XStreamImplicit; 

@XStreamAlias("Node") 
public class Node { 
    @XStreamAsAttribute 
    private String name; 

    @XStreamImplicit 
    private List<Node> nodes = new ArrayList<Node>(); 

    public Node(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public List<Node> getNodes() { 
     return nodes; 
    } 

    public void setNodes(List<Node> nodes) { 
     this.nodes = nodes; 
    } 

    public void addNode(Node n) { 
     nodes.add(n); 
    } 
} 

主类:

import com.thoughtworks.xstream.XStream; 


public class NodeXStream { 

    public static void main(String[] args) { 
     Node n1 = new Node("1"); 
     Node n2 = new Node("2"); 
     Node n3 = new Node("3"); 
     Node n4 = new Node("4"); 
     Node n5 = new Node("5"); 

     n1.addNode(n2); 
     n1.addNode(n3); 

     n2.addNode(n4); 
     n3.addNode(n5); 


     XStream xs = new XStream(); 
     xs.processAnnotations(Node.class); 

     // To XML 
     String myXML = xs.toXML(n1); 

     // From XML 
     Node newNode = (Node) xs.fromXML(myXML); 

    } 

} 

编辑: 新增的反串行化代码。

要反序列化,您还需要将XPP3库添加到构建路径。它是XStream的一部分。

+0

我想反序列化,所以它应该是xs.fromXml()...但是我收到了一些异常,我正在尝试解决...谢谢! – icon666

+0

此代码也适用于反序列化。只需使用fromXML,它就会返回你的对象。我会将反序列化代码添加到答案中。 – pablosaraiva

+0

这是我得到 异常线程 “main” java.lang.ArrayIndexOutOfBoundsException:-1 \t在com.thoughtworks.xstream.core.util.FastStack.pop(FastStack.java:42) \t在COM。通过com.thoughtworks.xstream.io.xml.AbstractPullReader.moveDown(AbstractPullReader.java:103) \t at com.thoughtworks.xstream。 io.xml.XppReader。 (XppReader.java:63) \t --------------------------------------- --- 试图找出问题 – icon666

public class DigestNodes { 
    List<Node> nodes; 

    public DigestNodes() { 
     nodes= new ArrayList<Node>(); 
    } 

    public static void main(String[] args) { 
     DigestNodes digestStudents = new DigestNodes(); 
     digestStudents.digest(); 
    } 

    private void digest() { 
     try { 
      Digester digester = new Digester(); 

      digester.push(this); 

      digester.addObjectCreate("*/node", Node.class); 

      digester.addSetProperties("*/node"); 

      digester.addSetNext("*/node", "addNode"); 

      DigestNodes ds = (DigestNodes) digester.parse(this.getClass() 
           .getClassLoader() 
           .getResourceAsStream("node.xml")); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public void addNode(Node node) { 
     nodes.add(node); 
    } 
}