欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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>