这几天被同事问道是否可以用dom4j来操作代用命名空间的xml(类似:<CWMRDB:Catalog>这种标签)
由于没有研究过,同事决定使用java自带的api来编写。
今天有时间变查了一下资料,后来发现dom4j完全可以胜任这项工作。网上有很多代码,看来看去云里雾里的。后来看到一个网友写到(直接用冒号后边的标签就能取到),试了一下,果真可以。
下面写了一个测试例子,有xml的读写操作。有兴趣的朋友可以参考,代码比较简单,就不过多的介绍。
java代码:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
public class TestOperXML {
//@Test
public void testOfReader(){
String fileName = "D:\\tb_user1.xml";
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(new File(fileName));
Element root = doc.getRootElement();
Element content = root.element("XMI.content");
println(content.getName());
Element catalog = content.element("Catalog");
println(catalog.getName());
Namespace np = catalog.getNamespace();
println(catalog.getNamespace().getPrefix());
println("xmi.id:"+catalog.attribute("xmi.id").getText());
println("name:"+catalog.attribute("name").getText());
println("visibility:" + catalog.attribute("visibility").getText());
} catch (DocumentException e) {
e.printStackTrace();
}
}
//@Test
public void testOfWriter(){
Document doc = DocumentHelper.createDocument();
Element root = doc.addElement("XMI");
root.addNamespace("CWM", "org.omg.CWM1.0").addNamespace("CWMRDB", "org.omg.CWM1.0/Relational").addNamespace("CWMOLAP", "org.omg.CWM1.0/OLAP").addNamespace("CWMTFM", "org.omg.CWM1.0/Transformation").addAttribute("xmi.version", "1.1").addAttribute("timestamp", "5月 23 2016 13:10:03");
Element xmlHeader = root.addElement("XMI.header");
Element documentation = xmlHeader.addElement("XMI.documentation");
documentation.addElement("XMI.exporter").setText("Meta Integration Model Bridge");
documentation.addElement("XMI.exporterVersion").setText("6.0.3 - Jan 28 2009 18:35:56");
xmlHeader.addElement("metamodel").addAttribute("xmi.name", "CWM").addAttribute("xmi.version", "1.0");
Element content = root.addElement("XMI.content");
Element catalog = content.addElement("CWMRDB:Catalog").addAttribute("xmi.id", "_4").addAttribute("name", "Model_1").addAttribute("visibility", "public");
catalog.addNamespace("CWMRDB", "org.omg.CWM1.0/Relational");
Element schema = catalog.addElement("CWM:Namespace.ownedElement").addNamespace("CWM", "org.omg.CWM1.0").addElement("Schema");
schema.addNamespace("CWMRDB", "org.omg.CWM1.0/Relational");
schema.addElement("CWM:Namespace.ownedElement").addNamespace("CWM", "org.omg.CWM1.0");
try {
XMLWriter writer = new XMLWriter(new FileWriter("out.xml"));
writer.write(doc);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testOfXPath(){
String fileName = "D:\\tb_user1.xml";
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(new File(fileName));
List list = doc.selectNodes("//XMI/XMI.content/CWMRDB:Catalog");
for(Object o : list){
Element ele = (Element)o;
println(ele.getName());
List list1 = ele.selectNodes("//CWMRDB:Catalog");
println(list1);
}
}catch(Exception e){
e.printStackTrace();
}
}
private void println(Object o){
if(o == null){
System.out.println(":>> null ");
}else{
System.out.println(":>> "+o.toString());
}
}
}
xml代码:
<?xml version="1.0" encoding="utf-8"?> <XMI xmlns:CWM="org.omg.CWM1.0" xmlns:CWMRDB="org.omg.CWM1.0/Relational" xmlns:CWMOLAP="org.omg.CWM1.0/OLAP" xmlns:CWMTFM="org.omg.CWM1.0/Transformation" xmi.version="1.1" timestamp="5月 23 2016 13:10:03"> <XMI.header> <XMI.documentation> <XMI.exporter>Meta Integration Model Bridge</XMI.exporter> <XMI.exporterVersion>6.0.3 - Jan 28 2009 18:35:56</XMI.exporterVersion> </XMI.documentation> <XMI.metamodel xmi.name="CWM" xmi.version="1.0"/> </XMI.header> <XMI.content> <CWMRDB:Catalog xmi.id="_4" name="Model_1" visibility="public"> <CWM:Namespace.ownedElement> <CWMRDB:Schema xmi.id="_5" name="unnamed_5" visibility="public" namespace="_4"> <CWM:Namespace.ownedElement></CWM:Namespace.ownedElement> </CWMRDB:Schema> </CWM:Namespace.ownedElement> </CWMRDB:Catalog> <CWM:Catalog></CWM:Catalog> </XMI.content> </XMI>