`
zqding
  • 浏览: 93759 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

java DOM 遍历 XML

    博客分类:
  • Java
阅读更多

一、XML文件test.xml,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<persons>
        <person>
                <name>xiaohui</name>
                <age>23</age>
        </person>
        <person>
                <name>yanzi</name>
                <age>20</age>
        </person>
</persons>

 

 

二、JAVA程序:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.*;
import java.io.File;

public class TraverseXML 
{
        public static void main(String[] args)
        {
                try{
                String file = "TestData\\test.xml";
                DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
                DocumentBuilder docBuilder = dbf.newDocumentBuilder();
                Document doc = docBuilder.parse(new File(file));
                
                NodeList nodes = doc.getElementsByTagName("person");
                System.out.println("总共有"+nodes.getLength()+"个人。");
                
                for(int i=0;i<nodes.getLength();i++)
                {
                        Node node = nodes.item(i);
                        NodeList childNodes = node.getChildNodes();
                        System.out.println("person有"+childNodes.getLength()+"个节点。");
                        
                        for(int j=0;j<childNodes.getLength();j++)
                        {
                                Node childNode = childNodes.item(j);
                                if(childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getNodeName().equals("name"))
                                        System.out.println("名字:"+childNode.getFirstChild().getNodeValue());
                                if(childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getNodeName().equals("age"))
                                        System.out.println("年龄:"+childNode.getFirstChild().getNodeValue());
                        }                        
                        System.out.println();
                }
                }catch(Exception e){
                        e.printStackTrace();
                }
        }
}

 

 

三、判断节点类型和获取节点的名字和值,Node对象具有以下三个方法可以实现。
        getNodeType() :获取节点的类型,返回值为short类型。以下是节点类型表和对应的short值。
       
         getNodeName():获取节点的名字,返回值为String类型。
       
        getNodeValue():获取节点的值,如果节点类型为TEXT_NODE,则返回文本值,返回值为String类型。

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.io.OutputFormat;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
import java.io.*;
import org.dom4j.Attribute;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import java.util.List;
import java.util.Iterator;
import org.dom4j.QName;

public class dom4j {
    public void readAttribute(String filename, String xpath, String attribute) {
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read(new File(filename));
            List list = document.selectNodes(xpath);
            Iterator iter = list.iterator();
            while (iter.hasNext()) {
                Element element = (Element) iter.next();
                System.out.println("element=  "+element);
                System.out.println("element.attributeValue(attribute)= "+element.attributeValue(attribute));
            }

        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] argv) {
        dom4j ptree = new dom4j();
                   ptree.printXML();
    }

//    创建一个xml文件
         public void changeXML() {
           // 创建一个xml document对象
           Document document = DocumentHelper.createDocument();
           // 创建根节点元素
           Element books = document.addElement("books");
           // 给books添加注释
           books.addComment("—An XML Example");
           // 使用addProcessingInstruction()方法增加一个处理指令
           books.addProcessingInstruction("target", "text");
           // 在当前元素后增加一个子元素
           Element bookone = books.addElement("bookone");
           // 设置当前元素的属性
           bookone.addAttribute("title", "XML study");
           bookone.addAttribute("publisher", "angellove workers");
           Element article = bookone.addElement("article");
           article.addAttribute("level", "high");
           article.addAttribute("date", "December-2007");
           Element titleElement = article.addElement("title");
           // 设置当前元素的文本值,即是内容
           titleElement.setText("Java configuration with XML");
           Element authorElement = article.addElement("author");
           Element firstNameElement = authorElement.addElement("firstname");
           firstNameElement.setText("angel");
           Element lastNameElement = authorElement.addElement("lastname");
           lastNameElement.setText("free");
           // XML 声明 <?xml version="1.0" encoding="UTF-8"?> 自动添加到 XML 文档中。
           try {
             // 创建一个xml写入流,将生成的xml文件写入指定的文件中
             // 使用优雅的方式写入(一共有三种方式:普通方式,优雅方式和紧凑方式)
             //紧凑方式写入format = OutputFormat.createCompactFormat();
             OutputFormat format = OutputFormat.createPrettyPrint();
             format.setEncoding("GBK");
             XMLWriter output = new XMLWriter(
                 new FileWriter(new File("books.xml")), format);
             output.write(document);
             output.close();
           }
           catch (IOException e) {
             System.out.println(e.getMessage());
           }
         }

 //    使用XPath表达式的查询
         public void modifXML(File inputXml) {
           try {
             //创建一个读取xml文件的对象
             SAXReader saxReader = new SAXReader();
             //读取并获得xml文档
             Document document = saxReader.read(inputXml);
             //使用XPATH表达式从article元素中获得level节点列表
             List list = document.selectNodes("//article/@level");
             //创建一个迭代器.
             Iterator iter = list.iterator();
             while (iter.hasNext()) {
               //获得level节点的属性
               Attribute attribute = (Attribute) iter.next();
               if (attribute.getValue().equals("high"))
                 //设置属性的值
                 attribute.setValue("low");
             }

             list = document.selectNodes("//article/@date");
             iter = list.iterator();
             while (iter.hasNext()) {
               Attribute attribute = (Attribute) iter.next();
               if (attribute.getValue().equals("December-2007"))
                 attribute.setValue("October-2006");
             }

             list = document.selectNodes("//article");
             iter = list.iterator();
             while (iter.hasNext()) {
               Element element = (Element) iter.next();
               Iterator iterator = element.elementIterator("title");
               while (iterator.hasNext()) {
                 Element titleElement = (Element) iterator.next();
                 //获得属性的文本.
                 if (titleElement.getText().equals("Java configuration with XML"))

                   //重新设置属性的文本
                   titleElement.setText("good good study,day day up");

               }

             }

             list = document.selectNodes("//article/author");
             iter = list.iterator();
             while (iter.hasNext()) {
               Element element = (Element) iter.next();
               Iterator iterator = element.elementIterator("firstname");
               while (iterator.hasNext()) {
                 Element firstNameElement = (Element) iterator.next();
                 if (firstNameElement.getText().equals("angel"))
                   firstNameElement.setText("god");
               }

             }

             list = document.selectNodes("//article/author");
             iter = list.iterator();

             while (iter.hasNext()) {

               Element element = (Element) iter.next();
               Iterator iterator = element.elementIterator("lastname");

               while (iterator.hasNext()) {

                 Element lastNameElement = (Element) iterator.next();
                 if (lastNameElement.getText().equals("free"))
                   lastNameElement.setText("dark");
               }
             }

             OutputFormat format = OutputFormat.createPrettyPrint();
             format.setEncoding("GBK");
             XMLWriter output = new XMLWriter(
                 new FileWriter(new File("modifyBooks.xml")), format);
             output.write(document);
             output.close();
           }

           catch (DocumentException e) {
             System.out.println("aaaa" + e.getMessage());
           }

           catch (IOException e) {
             System.out.println("rrr" + e.getMessage());
           }

         }

    //    递归遍历:打印出xml树
         public void printXML() {
    
           System.out.println("<?xml version='1.0' encoding='GBK'?>");
           System.out.println();
    
           try {
    
             SAXReader sreader = new SAXReader();
             Document document = sreader.read(new File("books.xml"));
             Element root = document.getRootElement();
             printtree(root, 0);
    
           }
           catch (Exception e) {
    
             e.printStackTrace();
           }
         }

         public void printtree(Element node, int i) {
    
           //打印一个节点开始"<",前面有空格
           System.out.println();
           for (int j = 1; j <= i; j++) {
    
             System.out.print(" ");
           }
           System.out.print("<");
    
           //打印节点的名字
           String name = node.getName();
           System.out.print(name);
           //打印节点属性和属性值
           Iterator it = node.attributeIterator();
           while (it.hasNext()) {
             Attribute attr = (Attribute) it.next();
             System.out.print(" " + attr.getName() + "=" + attr.getValue());
           }
           //打印节点的结束">";
           System.out.print(" >");
           //判断是不是有文本值
           if (!"".equals(node.getText())) {
             System.out.print(node.getText());
           }
    
           //此处开始递归调用
           Iterator ite = node.elementIterator();
           while (ite.hasNext()) {
    
             Element snode = (Element) ite.next();
             printtree(snode, i + 2);
           }
    
           for (int j = i; j >= 1; j--) {
    
             System.out.print(" ");
           }
           System.out.println("</" + name + ">");
         }

}

 

分享到:
评论

相关推荐

    Dom4j遍历解析XML

    Dom4j遍历解析XMLDom4j遍历解析XML

    处理及遍历XML文档DOM元素属性及方法整理

    用于处理XML文档的DOM元素属性 代码如下: childNodes:返回当前元素所有子元素的数组... 用于遍历XML文档的DOM元素方法 代码如下: getElementById(id)(document):获取有指定唯一ID属性值文档中的元素; getElementsByT

    dom4j 解析(读取) xml 节点数据

    此方法解析xml时,不受xml层级的限制。文件中包含了说明文档,java类,以及所使用到的*.jar。并对代码做了注释让你一目了然……

    Xml的递归遍历

    用java递归dom解析器解析遍历Xml文档

    Java Dom4jHelper.java XML操作类下载.rar

    Java Dom4jHelper.java XML文件操作类下载,可实现解析xml文档,遍历文档,遍历解析元素,获得根元素,修改xml某节点的值,输出文件路径及文件名,将xml转换为字符串,字符串转换为文档等功能。

    Java实现用DOM文档和XML文件互换的操作

    利用DOM规范,可以实现DOM文档和XML之间的相互转换,遍历、操作相应DOM文档的内容。可以说,要自由的操纵XML文件,就要用到DOM规范。DOM文档中的逻辑结构可以用节点树的形式进行表述。通过对XML文件的解析处理,XML...

    Java XML文件操作类:Dom4jHelper源文件下载.rar

    Java XML文件操作类:Dom4jHelper源代码文件下载,实现的功能:解析url xml文档,遍历解析文档,遍历解析元素,解析文件,获得根元素,修改xml某节点的值,输出文件路径及文件名 如果输出文件为null,则默认为原xml文件,...

    PULL解析xml的demo

    通用性强,它会将XML文件的所有内容读取到内存中,然后使用DOM API遍历XML树、检索所需的数据; 优点:简单直观,但需要将文档读取到内存, 缺点:并不太适合移动设备; 2,SAX SAX是一个解析速度快并且占用内存少的...

    java解析xml之dom解析xml示例分享

    DOM将整个XML文件加载到内存中,并构建出节点树;应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点、属性等信息;这种方式便于对XML节点的添加修改等,而且解析也很方便,然后它比较耗费内存,解析速度也...

    Dom4j对Java xml文件的操作

    Dom4j对Java xml文件的操作。对节点的增删改查,把字符串读成XML,循环遍历节点!附带所要用的jar包,还有说明!

    xml入门 解析与创建 入门练习

    需要在lib下拷入dom4j包,jdom.jar包。路径需要自己改。四种方式解析创建xml文件,原始的遍历xml,以及一般运用读取,更新xml。

    java解析xml及4种常用解析比较

    JDOM对于大多数Java/XML应用程序来说当然是有用的,并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出...

    Xml 文件处理 java

    自己写的一个XML文件处理,通过DOM4J,实现了逐一遍历整个XML文件,直到找到找到需要修改节点,退出程序,这个代码里面只调试了updatesinglenodevalue这一个函数,其他要用,自己调试,这个工程不需更改就可以使用,...

    Java中四种XML解析技术

    在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML 这块来测试,因为遍历 XML 是工作中使用最多的(至少我认为)。 预 备 测试环境: AMD 毒龙1.4G OC 1.5G、256M DDR333、Windows2000 Server SP...

    XML解析工具

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API...这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

    JAVA_API1.6文档(中文)

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml...

    使用dom4j读写XML文档

    使用dom4j读写XML文档 1.获取文档的根节点. Element rootElm = document.getRootElement(); 2.取得某节点的单个子节点. Element memberElm=root.element("member");// "member"是节点名 3.取得节点的文字 String ...

    dom4j-jdom封装和解析例子

    String fromRead=Dom4jTest2.class.getClassLoader().getResource("xml/map1.xml").getPath(); List&lt;Pois&gt; list=new ArrayList(); SAXReader saxReader = new SAXReader(); org.dom4j.Document document=...

    Dom4jHelper Java XML操作实例类

    Dom4jHelper Java XML操作实例类,解析url xml文档,遍历解析文档,遍历解析元素,解析文件,获得根元素,修改xml某节点的值,输出文件路径及文件名 如果输出文件为null,则默认为原xml文件,xml转换为字符串,字符串转换为...

Global site tag (gtag.js) - Google Analytics