`
zqding
  • 浏览: 96062 次
  • 性别: 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 + ">");
         }

}

 

分享到:
评论

相关推荐

    Java DOM 生成XML

    DOM为XML文档提供了一种内存中的表示方式,使得开发人员可以方便地创建、修改和遍历XML文档。在Java中,DOM API被包含在`javax.xml.parsers`和`org.w3c.dom`这两个包中。 DOM API的核心类包括`...

    遍历XML文件内所有节点和属性

    针对这一问题,"遍历XML文件内所有节点和属性"的非递归方法应运而生。 在描述中提到的“比递归调用的速度要快很多”,这通常是指通过迭代而非递归的方式遍历XML文档。递归方法会为每个节点创建新的函数调用栈,而当...

    java dom 解析 xml 实例

    Java DOM 解析 XML 实例 Java DOM 解析 XML 实例是 Java 语言中常用的 XML 解析方法之一,使用 W3C 推荐的文档对象模型(Document Object Model,DOM)来解析 XML 文档。DOM 提供了一个树形结构的对象模型,通过...

    java_dom解析xml xml java

    ### Java DOM 解析 XML 在Java中,DOM(Document Object Model)是一种用于处理XML文档的标准接口。通过DOM,我们可以将整个XML文档加载到内存中,并对其进行读取、修改等操作。这种方式非常适合那些需要对XML文档...

    java dom 操作xml

    Java DOM(Document Object Model)是Java处理XML文档的一种标准方式,它将XML文档解析成一个树形结构,每个XML元素、属性和文本内容都对应树中的一个节点。DOM提供了丰富的API,允许开发者对XML进行增、删、改、查...

    DOM_XML.rar_DOM_dom xml_dom xml java_dom解析xml_java解析xml

    标题中的"DOM_XML.rar"可能是一个包含DOM解析XML相关示例的压缩文件,"DOM_dom xml_dom xml java_dom解析xml_java解析xml"这部分描述了文件的主要内容,即关于DOM(Document Object Model)在XML解析中的应用,特别...

    JAVA DOM解析XML文件过程详解

    JAVA DOM 解析 XML 文件过程详解 JAVA DOM 解析 XML 文件过程详解是指使用 JAVA 语言通过 DOM(Document Object Model)解析 XML 文件的过程。DOM 是一种应用程序接口(API),它将 XML 文档转换为一个树形结构,...

    使用递归和dom遍历dom树形结构

    以下是一个使用递归和DOM来遍历XML文档的Java代码示例: ```java package com.dowebber.xmlreader; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax....

    Java与XML联合编程之DOM篇.rar_dom xml_dom xml java_java xml

    在Java中,DOM解析XML文件主要涉及到`javax.xml.parsers.DocumentBuilderFactory`和`javax.xml.parsers.DocumentBuilder`这两个类。首先,我们创建一个`DocumentBuilderFactory`实例,然后用它来获取一个`...

    java遍历文件夹解析XML.doc

    在Java编程中,遍历文件夹和解析XML是两种常见的操作,它们在处理数据和构建应用程序时发挥着关键作用。这篇文档"java遍历文件夹解析XML.doc"可能详细介绍了如何使用Java进行这两个任务。 首先,让我们深入了解一下...

    java平台中使用DOM解析xml文件

    5. **遍历和操作XML结构**:现在,你可以使用DOM API遍历XML文档的节点,获取或修改元素、属性和文本。 ```java NodeList nodeList = doc.getElementsByTagName("tag_name"); for (int i = 0; i (); i++) { ...

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

    接下来,我们可以递归地遍历XML结构,访问每个元素节点及其属性: ```java void traverse(Element element) { // 访问元素的属性 for (Attribute attr : element.attributes()) { System.out.println("属性名: ...

    java dom sax XML入门教程

    Java作为一款强大的编程语言,提供了多种处理XML的API,其中包括DOM(Document Object Model)和SAX(Simple API for XML)。本教程将帮助初学者深入理解这两种解析XML的方法。 1. DOM解析器 DOM解析器将整个XML...

    java 的dom的读取xml

    Java中的DOM解析XML是一种常见的处理XML数据的方式,它允许程序以结构化的方式访问和操作XML文档。DOM(Document Object Model)是一种W3C标准,它将XML文档转换为一棵节点树,每个节点代表XML文档的一个部分,如...

    解析XML所需的jar dom.jar

    总的来说,"dom.jar"在Java开发中用于XML解析,特别是对于那些需要对XML文档进行全面操作或遍历的场景。理解DOM解析机制和如何在Java中使用DOM API,是任何涉及XML处理的Java开发者必备的基础知识。

    java dom4j 解析xml的例子,可用

    Java DOM4J库是用于处理XML文档的一个强大的开源框架,它提供了一种灵活且高效的方式来解析、创建和操作XML内容。DOM4J这个名字来源于“Document Object Model”(DOM)和“Java”的组合,它扩展了DOM接口,同时引入...

    java使用dom解析xml

    总结来说,Java 中使用 DOM 解析 XML 是一种直观且功能强大的方式,尤其适用于对整个 XML 文档进行遍历和修改。不过,考虑到性能和内存占用,对于大文件或资源有限的环境,可能需要考虑其他解析策略。在 Android ...

Global site tag (gtag.js) - Google Analytics