包含嵌套的标签
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和简单的,但一直没能弄明白。
任何帮助,将不胜感激。
此代码使用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()...但是我收到了一些异常,我正在尝试解决...谢谢! – icon666
此代码也适用于反序列化。只需使用fromXML,它就会返回你的对象。我会将反序列化代码添加到答案中。 – pablosaraiva
这是我得到 异常线程 “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。
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);
}
}
我还没有使用jaxb多年,但它会在这里工作吗? – digitaljoel