繁体   English   中英

解析包含嵌套标签的xml

[英]parsing xml containing nested tags

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和简单的方法,但无法弄清楚。

任何帮助,将不胜感激。

此代码使用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的一部分。

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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM