`

采用DOM操作XML文件

 
阅读更多
Java与XML(一):采用DOM操作XML文件
1.DOM介绍

DOM 是用与平台和语言无关的方式表示XML文档的官方 W3C 标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构, 然后才能做任何工作。 由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。 它还可以在任何时候在树中上下导航, 而不是像 SAX 那样是一次性的处理。 DOM使用起来也要简单得多。

2.采用DOM解析XML文件

代码实例:

import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;/** * @Author:胡家威 * @CreateTime:2011-9-6 下午10:12:00 * @Description:采用DOM解析XML文件 */public class DomXML {    public void domXMl(String fileName) {        try {            DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();            InputStream input = new FileInputStream(fileName);            Document doc = domBuilder.parse(input);            Element root = doc.getDocumentElement();            NodeList students = root.getChildNodes();            if (students != null) {                for (int i = 0, size = students.getLength(); i < size; i++) {                    Node student = students.item(i);                    if (student.getNodeType() == Node.ELEMENT_NODE) {                        String sexString = student.getAttributes().getNamedItem("性别").getNodeValue();                        System.out.println(sexString);                    }                    for (Node node = student.getFirstChild(); node != null; node = node.getNextSibling()) {                        if (node.getNodeType() == Node.ELEMENT_NODE) {                            if (node.getNodeName().equals("姓名")) {                                String name = node.getFirstChild().getNodeValue();                                System.out.println(name);                            }                            if (node.getNodeName().equals("年龄")) {                                String age = node.getFirstChild().getNodeValue();                                System.out.println(age);                            }                            if (node.getNodeName().equals("电话")) {                                String tel = node.getFirstChild().getNodeValue();                                System.out.println(tel);                            }                        }                    }                }            }        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (ParserConfigurationException e) {            e.printStackTrace();        } catch (SAXException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    public static void main(String[] args) {        DomXML xmlTest = new DomXML();        String fileName = "students.xml";        xmlTest.domXMl(fileName);    }}目录结构:在项目的根目录下面放置一个XML文件


<?xml version="1.0" encoding="UTF-8"?>

<学生花名册>

    <学生 性别="男">

        <姓名>李华</姓名>

        <年龄>14</年龄>

        <电话>6287555</电话>

    </学生>

    <学生 性别="男">

        <姓名>张三</姓名>

        <年龄>16</年龄>

        <电话>8273425</电话>

    </学生>

</学生花名册>
  

运行结果:



李华

14

6287555



张三

16

8273425

3.使用DOM操作XML文件,进行增删查改

代码示例:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
* @Author:胡家威
* @CreateTime:2011-9-23 下午09:08:03
* @Description:DOM操作XML文件,增删查改
*/

public class DealXML {

  public static void main(String[] args) {
    try {
      // Document-->Node
      Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("products.xml");
      Element root = document.getDocumentElement();

      // 增加一个元素节点
      Element newChild = document.createElement("project");
      newChild.setAttribute("id", "NP001");// 添加id属性

      Element nelement = document.createElement("name");// 元素节点
      nelement.setTextContent("New Project");
      newChild.appendChild(nelement);
      Element selement = document.createElement("start-date");
      selement.setTextContent("March 20 1999");
      newChild.appendChild(selement);
      Element eelement = document.createElement("end-date");
      eelement.setTextContent("July 30 2004");
      newChild.appendChild(eelement);

      root.appendChild(newChild);

      // 查找一个元素节点
      String expression = "/projects/project[3]";
      Element node = (Element) selectSingleNode(expression, root);// 转型一下
      // 修改一个元素节点
      node.getAttributeNode("id").setNodeValue("new "+node.getAttribute("id"));
      // root.getElementsByTagName("project").item(2).setTextContent("");
      expression = "/projects/project";
      NodeList nodeList = selectNodes(expression, root);
      nodeList.item(1).getAttributes().getNamedItem("id").setNodeValue("New Id");
      // 删除一个元素节点
      expression = "/projects/project[2]";
      node = (Element) selectSingleNode(expression, root);
      root.removeChild(root.getFirstChild());

      output(root, "newProjects.xml");
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (ParserConfigurationException e) {
      e.printStackTrace();
    }
  }

  public static void output(Node node, String filename) {
    TransformerFactory transFactory = TransformerFactory.newInstance();
    try {
      Transformer transformer = transFactory.newTransformer();
      // 设置各种输出属性
      transformer.setOutputProperty("encoding", "gb2312");
      transformer.setOutputProperty("indent", "yes");
      DOMSource source = new DOMSource();
      // 将待转换输出节点赋值给DOM源模型的持有者(holder)
      source.setNode(node);
      StreamResult result = new StreamResult();
      if (filename == null) {
        // 设置标准输出流为transformer的底层输出目标
        result.setOutputStream(System.out);
      } else {
        result.setOutputStream(new FileOutputStream(filename));
      }
      // 执行转换从源模型到控制台输出流
      transformer.transform(source, result);
    } catch (TransformerConfigurationException e) {
      e.printStackTrace();
    } catch (TransformerException e) {
      e.printStackTrace();
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
  }

  // 查找一个单独的节点
  private static Node selectSingleNode(String expression, Object source) {
    try {
      return (Node) XPathFactory.newInstance().newXPath().evaluate(expression, source, XPathConstants.NODE);
    } catch (XPathExpressionException e) {
      e.printStackTrace();
      return null;
    }
  }

  // 查找所有的节点
  private static NodeList selectNodes(String expression, Object source) {
    try {
      return (NodeList) XPathFactory.newInstance().newXPath().evaluate(expression, source, XPathConstants.NODESET);
    } catch (XPathExpressionException e) {
      e.printStackTrace();
      return null;
    }
  }

}
左边是修改前的,右边的是修改了之后生成的XML文件



分享到:
评论

相关推荐

    Java与XML(一):采用DOM操作XML文件.docx

    在本文中,我们将探讨Java如何...总的来说,DOM解析适合那些需要频繁查询和修改XML文档的应用场景,尤其是当XML文件大小适中时。理解DOM的工作原理及其在Java中的应用是任何Java开发者处理XML文档所必需的技能之一。

    Dom4j解析XML文档.doc

    无论是读取XML文件,解析XML字符串,还是创建、修改和遍历XML结构,DOM4J都提供了简洁的接口,极大地简化了开发者的工作。在实际的开发中,掌握DOM4J的使用,能够帮助你更有效地处理XML数据,提高代码的可维护性和...

    java 的dom的读取xml

    3. 通过DocumentBuilder的parse方法加载XML文件到Document对象。 4. 创建XPathFactory实例,用于创建XPath对象。 5. 使用XPath对象编译XPath表达式。 6. 执行XPath表达式,获取结果(可能是Element、NodeList、...

    android上使用DOM解析XML

    在Android中,可以通过`FileInputStream`或`AssetManager`从文件系统或资源中读取XML文件。 5. **解析XML** `parse()`方法返回一个`Document`对象,它是整个XML文档的根节点。可以使用`Document`对象提供的方法如`...

    DOM4J读取XML

    SAXReader采用事件驱动的方式读取XML文件,这意味着它并不会一次性将整个XML文档加载到内存中,而是逐个节点地读取,这样对于大型XML文件而言,可以有效节省内存资源。 #### 解析XML文件 `Document doc = reader....

    (java)DOM解析XML文件并实现通讯录

    在Java编程语言中,DOM(Document Object Model)是一种解析XML文档的标准方法,它将XML文件转化为一个树形结构,使得开发者可以方便地访问和操作XML文档的每一个元素。本项目"DOM解析XML文件并实现通讯录"就是利用...

    经典XML处理实例采用DOM处理模式

    1. **DOM解析器**:DOM解析器负责读取XML文件并构建DOM树。在Java中,可以使用`javax.xml.parsers.DocumentBuilderFactory`和`javax.xml.parsers.DocumentBuilder`类来创建和初始化解析器。 2. **创建DOM树**:解析...

    java中用dom解析xml的经典入门级文档

    接着,它读取指定的XML文件,并将其解析为一个`Document`对象。通过遍历文档中的各个节点,程序能够提取出所需的属性值和文本内容,并打印出来。 ##### 3. 错误处理 在上述示例代码中,我们还处理了几种可能发生的...

    java 操作XML 采用(dom+dom4j)读写源码 lib包

    读取XML文件: ```java import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; ...

    用dom4j解析xml文件

    这可以通过`DocumentFactory.createDocument()`方法实现,然后使用`SAXReader.read(File file)`来读取XML文件。读取完成后,可以遍历Document对象,找到需要修改的节点,并进行相应的操作。 2. **创建XML(Creatxml...

    关于用oracle的dbms_xmldom导出xml文档编码格式UTF-8的问题总结

    在处理Oracle数据库中使用DBMS_XMLDOM模块创建并导出XML文档时,经常会遇到有关文档编码格式的问题,尤其是如何确保导出的XML文档采用UTF-8编码格式。本文将对这一问题进行详细的探讨,并提供解决方法。 #### 问题...

    dom4j操作XMl例子

    5. **读取XML文档**:如果要解析已存在的XML文件,可以使用`SAXReader`类读取。 ```java SAXReader reader = new SAXReader(); Document doc = reader.read(new File("path_to_xml_file.xml")); ``` 6. **遍历...

    xmldom4j解析

    2. 读取XML文件:通过`DocumentHelper.parseText()`或`SAXReader.read()`方法读取XML文件到Document对象。 3. 访问XML节点:使用XPath表达式或者遍历节点的方式访问XML中的元素、属性、文本等。 4. 修改XML:添加、...

    使用DOM4j解析XML文件

    在使用DOM4j解析XML文件时,首先需要导入DOM4j的相关包,如`SAXReader`用于读取XML文件,`Document`表示整个XML文档,`Element`表示XML文档中的元素,以及`Attribute`表示元素的属性。以下是一个使用DOM4j解析XML...

    dom4j API 用于解析XML的java库

    6. **读写XML文件**:DOM4J提供了一系列的`Writer`和`Reader`,可以方便地读取XML文件到内存,或者将内存中的XML结构写入文件。例如,`XMLWriter`用于格式化输出XML,而`SAXWriter`则用于快速无格式的输出。 7. **...

    DOM4j\pull\dom解析XML文件

    总的来说,SAX解析器以其高效和内存友好的特性在处理大型XML文件时更受青睐,而DOM解析器则提供了更便捷的编程模型,适合于需要对XML文档进行整体操作的场合。开发者应根据项目需求和资源限制来决定使用哪种解析方式...

    VTD-XML 不同于SAX和DOM的XML高效解析器

    SAX是一种事件驱动的解析器,它在读取XML文档时触发一系列事件,如开始元素、结束元素等。SAX解析器占用的内存较少,适合处理大型XML文件,但不支持XPath,且不保留完整的文档结构,因此不适合需要多次查找或修改...

    ASP.NET读取XML文件4种方法

    使用DOM读取XML文件 使用DOM可以更灵活地操作XML文件中的数据。首先需要创建一个`XmlDocument`实例,然后使用`Load`方法加载XML文件。 **示例代码:** ```html &lt;%@ Import Namespace="System.Xml" %&gt; ...

    java dom4j解析xml

    - 解析XML的基本步骤:创建解析器工厂,通过工厂创建解析器,解析器读取XML文件并生成Document对象。 3. **读取XML** - 使用`DocumentBuilder`解析XML文件,得到`Document`对象,这代表整个XML文档。 - 通过`...

    dom4.jar包,高效xml解析

    2. 加载XML文件,可以使用`DocumentFactory.createDocument()`或`SAXReader.read()`方法。 3. 使用XPath创建XPath对象,如`XPathFactory.newInstance().newXPath()`。 4. 编写XPath表达式并执行,如`String ...

Global site tag (gtag.js) - Google Analytics