Dom4j解析XML代码示例
程序员文章站
2022-06-20 11:14:17
...
package xml;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* <pre>
*
* </pre>
*
* @author
* @version 1.00.00
*
* <pre>
* 修改记录
* 修改后版本: 修改人: 修改日期: 修改内容:
* </pre>
*/
public class TestDom4j {
private static Document doc = null;
static {
// 读取文件内容
// 方式1 读取html字符串并解析
/*String str = readFileContent("E:/gitHub/study-self/javase/java/src/xml/qysds.xml");
try {
//将字符串转为XML Document
doc = DocumentHelper.parseText(str);
} catch (DocumentException e) {
e.printStackTrace();
}*/
//方式2 读取html文件并解析
SAXReader reader = new SAXReader();
try {
doc = reader.read(new File("E:/gitHub/study-self/javase/java/src/xml/qysds.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
}
/**
* dom4j的基本用法
*/
@Test
public void test1() {
// getRootElement 获取根节点
Element rootElt = doc.getRootElement();
//getName 获取根节点便签名 taxML
System.out.println(rootElt.getName());
// element 获取节点下的节点
Element ywbw = rootElt.element("ywbw");
Element a106000 = ywbw.element("A106000");
Element mbksmxbGrid = a106000.element("mbksmxbGrid");
//elements() 获取元素的子元素集合
List<Element> mbksmxbGridlb = mbksmxbGrid.elements();
// attributeValue 获取标签属性值
System.out.println(mbksmxbGridlb.get(0).attributeValue("name"));
// getText 获取元素内容
System.out.println(mbksmxbGridlb.get(0).element("xmmc").getText());
// elements("kjzwmbwdksjehj") 获取指定名称的子元素集合
List<Element> kjzwmbwdksjehj = mbksmxbGridlb.get(0).elements("kjzwmbwdksjehj");
for (Element e : kjzwmbwdksjehj) {
System.out.println(e.getText());
}
System.out.println("**************获取子节点中的相同节点***************");
Iterator<Element> elementIterator = mbksmxbGrid.elementIterator();
while (elementIterator.hasNext()) {
Element next = elementIterator.next();
// Element.element().getText() == Element.elementTextTrim
System.out.println(next.element("kjzwmbwdksjehj").getText() + " " + next.elementTextTrim("kjzwmbwdksjehj"));
}
}
@Test
public void testSelector() {
// dom4j 存在命名空间导致document.selectNodes() 无返回结果
/*List<Node> nodes = doc.selectNodes("taxML/ywbw");
System.out.println(nodes.size());*/
//
Map map = new HashMap();
// 获得命名空间
String nsURI = doc.getRootElement().getNamespaceURI();
System.out.println(nsURI); //http://www.chinatax.gov.cn/dataspec/
map.put("xmlns", nsURI);
// 创建解析路径,就是在普通的解析路径前加上map里的key值
XPath x = doc.createXPath("xmlns:taxML/xmlns:ywbw/xmlns:A106000/xmlns:mbksmxbGrid/xmlns:mbksmxbGridlb/xmlns:xmmc");
x.setNamespaceURIs(map);
// 这样就拿到结果了
List<Node> nodes = x.selectNodes(doc);
nodes.forEach(node -> {
System.out.print(node.getText() + " - ");
System.out.print(node.getName() + " - ");
System.out.print(node.valueOf("@type"));
System.out.println();
});
}
public static String readFileContent(String fileName) {
File file = new File(fileName);
BufferedReader reader = null;
StringBuffer sbf = new StringBuffer();
try {
reader = new BufferedReader(new FileReader(file));
String tempStr;
while ((tempStr = reader.readLine()) != null) {
sbf.append(tempStr);
}
reader.close();
return sbf.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
return sbf.toString();
}
}
XML文件如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:taxML xsi:type="ns2:HXZGSB10085Response"
xmlns:ns2="http://www.chinatax.gov.cn/dataspec/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns2:ywbw>
<ns2:A106000 xsi:type="ns2:A106000Nd2018Ywbd">
<ns2:mbksmxbGrid>
<ns2:mbksmxbGridlb name="10季度">
<ns2:xmmc type = '10'>前十年度</ns2:xmmc>
<ns2:nd>2009</ns2:nd>
<ns2:kshylje>0</ns2:kshylje>
<ns2:flzckse>0</ns2:flzckse>
<ns2:hbqyzrkse>0</ns2:hbqyzrkse>
<ns2:hbqyzrkseSn>0</ns2:hbqyzrkseSn>
<ns2:qysdsmbksqylxDm>0 </ns2:qysdsmbksqylxDm>
<ns2:kmbdsdehj>0</ns2:kmbdsdehj>
<ns2:dndmbdksehj>0</ns2:dndmbdksehj>
<ns2:bnjnmbyjndksjehj>0</ns2:bnjnmbyjndksjehj>
<ns2:bnjwmbyjndksjehj>0</ns2:bnjwmbyjndksjehj>
<ns2:kjzwmbwdksjehj>test1</ns2:kjzwmbwdksjehj>
<ns2:kjzwmbwdksjehj>test2</ns2:kjzwmbwdksjehj>
</ns2:mbksmxbGridlb>
<ns2:mbksmxbGridlb>
<ns2:xmmc>前九年度</ns2:xmmc>
<ns2:nd>2010</ns2:nd>
<ns2:kshylje>0</ns2:kshylje>
<ns2:flzckse>0</ns2:flzckse>
<ns2:hbqyzrkse>0</ns2:hbqyzrkse>
<ns2:hbqyzrkseSn>0</ns2:hbqyzrkseSn>
<ns2:qysdsmbksqylxDm>0 </ns2:qysdsmbksqylxDm>
<ns2:kmbdsdehj>0</ns2:kmbdsdehj>
<ns2:dndmbdksehj>0</ns2:dndmbdksehj>
<ns2:bnjnmbyjndksjehj>0</ns2:bnjnmbyjndksjehj>
<ns2:bnjwmbyjndksjehj>0</ns2:bnjwmbyjndksjehj>
<ns2:kjzwmbwdksjehj>0</ns2:kjzwmbwdksjehj>
</ns2:mbksmxbGridlb>
<ns2:mbksmxbGridlb>
<ns2:xmmc>前八年度</ns2:xmmc>
<ns2:nd>2011</ns2:nd>
<ns2:kshylje>0</ns2:kshylje>
<ns2:flzckse>0</ns2:flzckse>
<ns2:hbqyzrkse>0</ns2:hbqyzrkse>
<ns2:hbqyzrkseSn>0</ns2:hbqyzrkseSn>
<ns2:qysdsmbksqylxDm>0 </ns2:qysdsmbksqylxDm>
<ns2:kmbdsdehj>0</ns2:kmbdsdehj>
<ns2:dndmbdksehj>0</ns2:dndmbdksehj>
<ns2:bnjnmbyjndksjehj>0</ns2:bnjnmbyjndksjehj>
<ns2:bnjwmbyjndksjehj>0</ns2:bnjwmbyjndksjehj>
<ns2:kjzwmbwdksjehj>0</ns2:kjzwmbwdksjehj>
</ns2:mbksmxbGridlb>
<ns2:mbksmxbGridlb>
<ns2:xmmc>前七年度</ns2:xmmc>
<ns2:nd>2012</ns2:nd>
<ns2:kshylje>0</ns2:kshylje>
<ns2:flzckse>0</ns2:flzckse>
<ns2:hbqyzrkse>0</ns2:hbqyzrkse>
<ns2:hbqyzrkseSn>0</ns2:hbqyzrkseSn>
<ns2:qysdsmbksqylxDm>0 </ns2:qysdsmbksqylxDm>
<ns2:kmbdsdehj>0</ns2:kmbdsdehj>
<ns2:dndmbdksehj>0</ns2:dndmbdksehj>
<ns2:bnjnmbyjndksjehj>0</ns2:bnjnmbyjndksjehj>
<ns2:bnjwmbyjndksjehj>0</ns2:bnjwmbyjndksjehj>
<ns2:kjzwmbwdksjehj>0</ns2:kjzwmbwdksjehj>
</ns2:mbksmxbGridlb>
<ns2:mbksmxbGridlb>
<ns2:xmmc>前六年度</ns2:xmmc>
<ns2:nd>2013</ns2:nd>
<ns2:kshylje>0</ns2:kshylje>
<ns2:flzckse>0</ns2:flzckse>
<ns2:hbqyzrkse>0</ns2:hbqyzrkse>
<ns2:hbqyzrkseSn>0</ns2:hbqyzrkseSn>
<ns2:qysdsmbksqylxDm>0 </ns2:qysdsmbksqylxDm>
<ns2:kmbdsdehj>0</ns2:kmbdsdehj>
<ns2:dndmbdksehj>0</ns2:dndmbdksehj>
<ns2:bnjnmbyjndksjehj>0</ns2:bnjnmbyjndksjehj>
<ns2:bnjwmbyjndksjehj>0</ns2:bnjwmbyjndksjehj>
<ns2:kjzwmbwdksjehj>0</ns2:kjzwmbwdksjehj>
</ns2:mbksmxbGridlb>
<ns2:mbksmxbGridlb>
<ns2:xmmc>前五年度</ns2:xmmc>
<ns2:nd>2014</ns2:nd>
<ns2:kshylje>0</ns2:kshylje>
<ns2:flzckse>0</ns2:flzckse>
<ns2:hbqyzrkse>0</ns2:hbqyzrkse>
<ns2:hbqyzrkseSn>0</ns2:hbqyzrkseSn>
<ns2:qysdsmbksqylxDm>0 </ns2:qysdsmbksqylxDm>
<ns2:kmbdsdehj>0</ns2:kmbdsdehj>
<ns2:dndmbdksehj>0</ns2:dndmbdksehj>
<ns2:bnjnmbyjndksjehj>0</ns2:bnjnmbyjndksjehj>
<ns2:bnjwmbyjndksjehj>0</ns2:bnjwmbyjndksjehj>
<ns2:kjzwmbwdksjehj>0</ns2:kjzwmbwdksjehj>
</ns2:mbksmxbGridlb>
<ns2:mbksmxbGridlb>
<ns2:xmmc>前四年度</ns2:xmmc>
<ns2:nd>2015</ns2:nd>
<ns2:kshylje>0</ns2:kshylje>
<ns2:flzckse>0</ns2:flzckse>
<ns2:hbqyzrkse>0</ns2:hbqyzrkse>
<ns2:hbqyzrkseSn>0</ns2:hbqyzrkseSn>
<ns2:qysdsmbksqylxDm>0 </ns2:qysdsmbksqylxDm>
<ns2:kmbdsdehj>0</ns2:kmbdsdehj>
<ns2:dndmbdksehj>0</ns2:dndmbdksehj>
<ns2:bnjnmbyjndksjehj>0</ns2:bnjnmbyjndksjehj>
<ns2:bnjwmbyjndksjehj>0</ns2:bnjwmbyjndksjehj>
<ns2:kjzwmbwdksjehj>0</ns2:kjzwmbwdksjehj>
</ns2:mbksmxbGridlb>
<ns2:mbksmxbGridlb>
<ns2:xmmc>前三年度</ns2:xmmc>
<ns2:nd>2016</ns2:nd>
<ns2:kshylje>0</ns2:kshylje>
<ns2:flzckse>0</ns2:flzckse>
<ns2:hbqyzrkse>0</ns2:hbqyzrkse>
<ns2:hbqyzrkseSn>0</ns2:hbqyzrkseSn>
<ns2:qysdsmbksqylxDm>0 </ns2:qysdsmbksqylxDm>
<ns2:kmbdsdehj>0</ns2:kmbdsdehj>
<ns2:dndmbdksehj>0</ns2:dndmbdksehj>
<ns2:bnjnmbyjndksjehj>0</ns2:bnjnmbyjndksjehj>
<ns2:bnjwmbyjndksjehj>0</ns2:bnjwmbyjndksjehj>
<ns2:kjzwmbwdksjehj>0</ns2:kjzwmbwdksjehj>
</ns2:mbksmxbGridlb>
<ns2:mbksmxbGridlb>
<ns2:xmmc>前二年度</ns2:xmmc>
<ns2:nd>2017</ns2:nd>
<ns2:kshylje>-65345.91</ns2:kshylje>
<ns2:flzckse>0</ns2:flzckse>
<ns2:hbqyzrkse>0</ns2:hbqyzrkse>
<ns2:hbqyzrkseSn>0</ns2:hbqyzrkseSn>
<ns2:qysdsmbksqylxDm>100</ns2:qysdsmbksqylxDm>
<ns2:kmbdsdehj>-65345.91</ns2:kmbdsdehj>
<ns2:dndmbdksehj>-65345.91</ns2:dndmbdksehj>
<ns2:bnjnmbyjndksjehj>0</ns2:bnjnmbyjndksjehj>
<ns2:bnjwmbyjndksjehj>0</ns2:bnjwmbyjndksjehj>
<ns2:kjzwmbwdksjehj>65345.91</ns2:kjzwmbwdksjehj>
</ns2:mbksmxbGridlb>
<ns2:mbksmxbGridlb>
<ns2:xmmc>前一年度</ns2:xmmc>
<ns2:nd>2018</ns2:nd>
<ns2:kshylje>-159153.79</ns2:kshylje>
<ns2:flzckse>0</ns2:flzckse>
<ns2:hbqyzrkse>0</ns2:hbqyzrkse>
<ns2:hbqyzrkseSn>0</ns2:hbqyzrkseSn>
<ns2:qysdsmbksqylxDm>100</ns2:qysdsmbksqylxDm>
<ns2:kmbdsdehj>-159153.79</ns2:kmbdsdehj>
<ns2:dndmbdksehj>-159153.79</ns2:dndmbdksehj>
<ns2:bnjnmbyjndksjehj>0</ns2:bnjnmbyjndksjehj>
<ns2:bnjwmbyjndksjehj>0</ns2:bnjwmbyjndksjehj>
<ns2:kjzwmbwdksjehj>159153.79</ns2:kjzwmbwdksjehj>
</ns2:mbksmxbGridlb>
<ns2:mbksmxbGridlb>
<ns2:xmmc>本年度</ns2:xmmc>
<ns2:nd>2019</ns2:nd>
<ns2:kshylje>-55969.61</ns2:kshylje>
<ns2:flzckse>0</ns2:flzckse>
<ns2:hbqyzrkse>0</ns2:hbqyzrkse>
<ns2:hbqyzrkseSn>0</ns2:hbqyzrkseSn>
<ns2:qysdsmbksqylxDm>100</ns2:qysdsmbksqylxDm>
<ns2:kmbdsdehj>0</ns2:kmbdsdehj>
<ns2:dndmbdksehj>-55969.61</ns2:dndmbdksehj>
<ns2:bnjnmbyjndksjehj>0</ns2:bnjnmbyjndksjehj>
<ns2:bnjwmbyjndksjehj>0</ns2:bnjwmbyjndksjehj>
<ns2:kjzwmbwdksjehj>55969.61</ns2:kjzwmbwdksjehj>
</ns2:mbksmxbGridlb>
</ns2:mbksmxbGrid>
</ns2:A106000>
</ns2:ywbw>
</ns2:taxML>