Dom4J 使用流程、拾遗

   解析xml时,可以使用的技术很多,但纵向比较下来,其实在Java中使用Dom4J 进行xml读取其实已经足够,在google上查阅资料后,得出的结论便是Dom4J最好使,所以现在记一笔。关于SAX,Dom,JDom怎么样,我不在赘述,有需要的朋友可以去一下博客仔细阅读,各取所需。地址如下:

JAVA读XML:sax,dom,jdom,dom4j的比较以及选择

使用Dom4J需要引入的jar包,如果想优雅地找到推荐看我的另一篇博客 

Java jar包查找攻略

使用Dom4J进行解析关键代码
 //使用SAXReader对文件进行读取
 SAXReader saxReader = new SAXReader();
 File file = new File("data.xml");
 //将XML内容读取到document对象中
 Document document = saxReader.read(file);
以下列xml代码为例,做演示。
data.xml
<?xml version="1.0" encoding="UTF-8"?>
<save-data>
    <now-status>
        <correct-num>11</correct-num>
        <incorrect-num>11</incorrect-num>
        <spare-num>20</spare-num>
        <now-position>22</now-position>
</now-status>
<total-num>149</total-num>
</save-data>
解析该xml代码
 //获取根节点下的所有子节点 save-data -> now-status/total-num
List<?> nodeList = document.getRootElement().elements();
for (Object o : nodeList) {
Element element = (Element) o;
//若无子节点则可读出当前结点的值
if (!element.isTextOnly()){
    List<?> childElements = element.elements();
//获取根节点下的第二层元素中的子节点 now-status -> correct-num/incorrect-num/spare-num/now-position
    for (Object childElement : childElements) {
    System.out.println(((Element)childElement).getName()+":"+((Element)childElement).getText());
    }
}else {
    //读出total-num的值
    System.out.println(element.getName()+":"+element.getText());
    }
}
输出结果为
 correct-num:11
 incorrect-num:11
 spare-num:20
 now-position:22
 total-num:149
   进行优化后,使用迭代进行所有节点值的访问,在这里我使用HashMap进行存储,如果是多个相同对象的XML,请使用其他的方式进行存储,否则会覆盖原来对象的值。

迭代方式代码:
public static Map<String, String> getChild(Element element){
    Map<String, String> valueMap = new HashMap<>();
    Iterator<Node> childNodes = element.nodeIterator();
    while (childNodes.hasNext()){
        Node node = childNodes.next();
        if (node instanceof Element){
            Element e = (Element) node;
            if (e.isTextOnly()){
                valueMap.put(e.getName(), e.getText());
        }else {
        //迭代 合并迭代后的值
        valueMap.putAll(getChild(e));
        }
    }
}
return valueMap;
}
dom4j 对XML文件进行某个属性值的修改,并且完成存储
关键代码
//可根据XML结点深度,自行放置参数,并完成修改值和保存XML
public static void modifyNode(Document document, String nowVal, String... keyValues) throws IOException, DocumentException {
    Element targetElement = document.getRootElement().element(keyValues[0]);
for (int i = 1; i < keyValues.length; i++) {
    targetElement = targetElement.element(keyValues[i]);
    if (i == keyValues.length-1){
    targetElement.setText(nowVal);
    }
}
//设置好修改的数据后,要将修改的xml保存到原文件中
//指定文件输出位置
FileOutputStream out = null;
try {
    out = new FileOutputStream(filePath);
    OutputFormat format = OutputFormat.createPrettyPrint();//标准化布局,适合查看时显示。
    //创建写入文件并指定文件格式
    format.setEncoding("utf-8");
    XMLWriter writer = new XMLWriter(out,format);
    //写入文件
    writer.write(document);
    writer.close();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
}
XML中,Node和Element的区别:
来自StackOverflow:

What’s the difference between an element and a node in XML?

A node can be an element node, an attribute node, a text node, or any
other of the node types explained in the “Node types” chapter.

    大意:一个node可以是element node ,一个attribute node, 一个 text node, 或者一些其他“Node types”所描述的node 类型.

An XML element is everything from (including) the element’s start tag
to (including) the element’s end tag.

大意:一个XML element 是涵盖了所有元素的起始标签和结束标签。
就范围而言:element>node

若有理解错误之处,烦请指出,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值