Dom4J 使用流程、拾遗

来源:互联网 发布:沈阳网络方面的兼职 编辑:程序博客网 时间:2024/06/05 08:16
   解析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-numList<?> 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结点深度,自行放置参数,并完成修改值和保存XMLpublic 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

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

原创粉丝点击