Java Xml 简明教程

Java DOM4J Parser - Modify XML Document

Java DOM4J API 提供了修改 XML 文档的方法。我们可能会遇到需要在一个较大的 XML 文档中更新几个详细信息的情况。例如,电子商务网站有很多产品,其价格可能每天或每月都会变化。在这种情况下,修改现有文件比重新创建 XML 文档更简单。在本章中,我们将通过一些示例学习如何使用 DOM4J API 修改现有的 XML 文档。

Modify XML Using Java DOM4J Parser

以下是使用 Java DOM4J 解析器修改 XML 文档的步骤:

  1. *第 1 步:*创建 SAXReader 对象

  2. *第 2 步:*读取 XML 文件

  3. *第 3 步:*解析 XML

  4. *第 4 步:*提取根元素

  5. *第 5 步:*修改元素

  6. *第 6 步:*创建 FileOutputStream

  7. *第 7 步:*将更新后的 XML 文档写入文件

  8. 步骤 8: 打印 XML 文稿

请参阅本节的 Parse XML Document 章节以了解前四个步骤。

Step 5: Modifying the elements

在步骤 4 中提取根元素后,我们可以使用 elements() 方法获取其任何子元素。我们可以通过编辑文本内容、更改属性值、添加新属性等方式来修改已存在的元素。

请参阅本节的 Create XML Document 章节以了解后三个步骤。

Modify Text Content

若要修改元素的文本内容,我们可以使用 setText() 方法来设置文本内容。它采用字符串作为参数,并将旧文本内容更新为新文本内容。此方法可在 Node 和 Element 接口中获得。

Example

在以下 studentData.xml 文件中,我们需要为学号为 493 的学生将分数从 80 更新为 64。

<?xml version="1.0" encoding="UTF-8"?>
<class>
   <student rollno="393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno="493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>80</marks>
   </student>

   <student rollno="593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

以下 ModifyTextContent.java 程序使用 SAXReader 读取上述 studentData.xml 文件。使用 elementIterator("student") 方法,我们在 Iterator 中获取所有学生元素。我们迭代所有元素以使用 attributeValue() 方法查找学号为 493 的学生,然后更新 marks 元素的文本内容。

import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class ModifyTextContent {
   public static void main(String[] args) {
      try {

    	 //Creating SAXReader
         SAXReader reader = new SAXReader();

    	 //Reading the XML file
         File inputFile = new File("studentData.xml");

         //Parsing the XML
         Document document = reader.read(inputFile);

         //Extracting the root
         Element RootElement = document.getRootElement();

         //Modifying the elements
         Iterator<Element> students = RootElement.elementIterator("student");
         while(students.hasNext()) {
        	Element student = students.next();
        	if(student.attributeValue("rollno").equals("493")) {
        	   Element marks = student.element("marks");
        	   marks.setText("64");
        	}
         }
         //Creating a FileOutputStream
         FileOutputStream newFile = new FileOutputStream("studentData.xml");

         //Writing the updated XML document into file
         XMLWriter writer = new XMLWriter(newFile);
         writer.write( document );

         //Printing the XML document
         OutputFormat format = OutputFormat.createPrettyPrint();
         XMLWriter consoleWriter = new XMLWriter( System.out, format );
         consoleWriter.write( document );

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

Output

学号为 493 的学生的成绩已从 80 更新为 64。

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

<class>
  <student rollno="393">
    <firstname>dinkar</firstname>
    <lastname>kad</lastname>
    <nickname>dinkar</nickname>
    <marks>85</marks>
  </student>
  <student rollno="493">
    <firstname>Vaneet</firstname>
    <lastname>Gupta</lastname>
    <nickname>vinni</nickname>
    <marks>64</marks>
  </student>
  <student rollno="593">
    <firstname>jasvir</firstname>
    <lastname>singn</lastname>
    <nickname>jazz</nickname>
    <marks>90</marks>
  </student>
</class>

Add New Elements

addElement() 方法向现有 XML 文稿添加新元素,将其置于该当前元素所有已存在的子元素末尾。我们需要将该元素的标签名称传递为参数。类似地,addText() 方法向该元素添加文本内容。 addAttribute() 将新属性添加到当前元素。我们需要将属性名称和属性值传递为参数。

以下 AddNewElements.java 程序读取我们在前一个示例中使用的 studentData.xml 文件,并使用上述方法添加新学生的详细信息。

import java.io.File;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class AddNewElements {
   public static void main(String[] args) {
      try {

    	 //Creating SAXReader
         SAXReader reader = new SAXReader();

    	 //Reading the XML file
         File inputFile = new File("studentData.xml");

         //Parsing the XML
         Document document = reader.read(inputFile);

         //Extracting the root
         Element RootElement = document.getRootElement();

         //Modifying the elements
         Element student = RootElement.addElement("student").addAttribute("rollno", "693");

         student.addElement("firstname").addText("John");
         student.addElement("lastname").addText("Daniel");
         student.addElement("nickname").addText("Johny");
         student.addElement("marks").addText("78");

         //Creating a FileOutputStream
         FileOutputStream newFile = new FileOutputStream("studentData.xml");

         //Writing the updated XML document into file
         XMLWriter writer = new XMLWriter(newFile);
         writer.write( document );

         //Printing the XML document
         OutputFormat format = OutputFormat.createPrettyPrint();
         XMLWriter consoleWriter = new XMLWriter( System.out, format );
         consoleWriter.write( document );

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

Output

添加新学生信息后的文件内容如下:

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

<class>
  <student rollno="393">
    <firstname>dinkar</firstname>
    <lastname>kad</lastname>
    <nickname>dinkar</nickname>
    <marks>85</marks>
  </student>
  <student rollno="493">
    <firstname>Vaneet</firstname>
    <lastname>Gupta</lastname>
    <nickname>vinni</nickname>
    <marks>64</marks>
  </student>
  <student rollno="593">
    <firstname>jasvir</firstname>
    <lastname>singn</lastname>
    <nickname>jazz</nickname>
    <marks>90</marks>
  </student>
  <student rollno="693">
    <firstname>John</firstname>
    <lastname>Daniel</lastname>
    <nickname>Johny</nickname>
    <marks>78</marks>
  </student>
</class>