【问题标题】:parsing xml containing nested tags解析包含嵌套标签的 xml
【发布时间】:2013-03-27 19:34:43
【问题描述】:

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和simple,但一直没弄明白。

任何帮助将不胜感激。

【问题讨论】:

  • 我已经很多年没用过 jaxb 但它在这里能用吗?

标签: java xml


【解决方案1】:

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

【讨论】:

  • 我正在尝试反序列化,所以它应该是 xs.fromXml()...但是我遇到了一些其他异常,我正在尝试解决...谢谢!!
  • 此代码也适用于反序列化。只需使用 fromXML,它就会返回您的对象。我将反序列化代码添加到答案中。
  • 这是我在线程 "main" java.lang.ArrayIndexOutOfBoundsException: -1 at com.thoughtworks.xstream.core.util.FastStack.pop(FastStack.java:42) at com .thoughtworks.xstream.io.xml.AbstractPullReader.move(AbstractPullReader.java:125) 在 com.thoughtworks.xstream.io.xml.AbstractPullReader.moveDown(AbstractPullReader.java:103) 在 com.thoughtworks.xstream.io.xml .XppReader.(XppReader.java:63) ------------------------- ----- 试图找出问题
  • 好的...所以在读取 xml 时出现了一些问题...您的解决方案有效...只是它不是从我的 xml 文件中读取...但这应该是相对的易于修复...谢谢!!!
  • 顺便说一句..你知道如何使用 apache 消化器做同样的事情吗?我想如果 xstream 支持它,digester 也可以...
【解决方案2】:
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);
    }
}

【讨论】:

    猜你喜欢
    • 2011-09-24
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    相关资源
    最近更新 更多