java DOM 遍历 XML

一、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 + ">");
         }

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值