最近熟悉了一下Dom4,写了一些小代码,分为生成与解析。
一、生成xml
需要的jar包:dom4j、jaxen
输出的结果xml
<?xml version="1.0" encoding="gb2312"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--Envelope Comment--><?target text?>
<SOAP-ENV:Body>
<m:InsertCP xmlns:m="http://tempuri.org/">Hello world!</m:InsertCP>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
java代码
package org.xmltool.test;
import java.io.FileWriter;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.QName;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
/* 创建Document */
Document doc = DocumentHelper.createDocument();
/* 创建备用Namespace */
Namespace SOAP_ENV_ns = new Namespace("SOAP-ENV",
"http://schemas.xmlsoap.org/soap/envelope/");
Namespace SOAP_ENC_ns = new Namespace("SOAP-ENC",
"http://schemas.xmlsoap.org/soap/encoding/");
Namespace xsi_ns = new Namespace("xsi",
"http://www.w3.org/2001/XMLSchema-instance");
Namespace xsd_ns = new Namespace("xsd",
"http://www.w3.org/2001/XMLSchema");
/* SOAP-ENV:Envelope */
QName envelopeQName = new QName("Envelope", SOAP_ENV_ns);/* 构造带名字空间头信息SOAP-ENV的节点Envelope */
Element envelopeElement = doc.addElement(envelopeQName);
envelopeElement.addComment("Envelope Comment")/* 添加注释 */
envelopeElement.addProcessingInstruction("target", "text");/* 添加指令 */
/* 添加其它名字空间(作为属性) */
envelopeElement.add(SOAP_ENC_ns);
envelopeElement.add(xsi_ns);
envelopeElement.add(xsd_ns);
/* SOAP-ENV:Body */
QName bodyQName = new QName("Body", SOAP_ENV_ns);
Element bodyElement = DocumentHelper.createElement(bodyQName);
envelopeElement.add(bodyElement);
/* m:InsertCP */
Namespace m_ns = new Namespace("m", "http://tempuri.org/");
QName insertCpQName = new QName("InsertCP", m_ns);
Element InsertCpElement = DocumentHelper.createElement(insertCpQName);
bodyElement.add(InsertCpElement);
OutputFormat format = OutputFormat.createPrettyPrint();/* 美化格式的输出 */
// OutputFormat format = OutputFormat.createCompactFormat();/*
// 压缩格式的输出,节省空间 */
format.setEncoding("gb2312");/* xml的编码 */
XMLWriter writer = new XMLWriter(new FileWriter("c:/test.xml"), format);
writer.write(doc);
writer.close();/* 必写无疑 */
}
}
二、解析xml
采用了Visitor模式。通过遍历XML的各个节点,完成XML解析。
package org.xmltool.bean;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.VisitorSupport;
import org.dom4j.io.SAXReader;
public class MyVisitor extends VisitorSupport {
@Override
public void visit(Element node)
{
System.out.println(node.getPath());
if ("InsertCP".equals(node.getName()))
{
System.out.println(node.getText());
}
}
public static void main(String[] args) throws DocumentException
{
SAXReader reader = new SAXReader();
Document doc = reader.read("c:/test.xml");
doc.accept(new MyVisitor());
}
}
执行结果为:
/SOAP-ENV:Envelope
/SOAP-ENV:Envelope/SOAP-ENV:Body
/SOAP-ENV:Envelope/SOAP-ENV:Body/m:InsertCP
Hello world!