- Java XML 教程
- Java XML 首页
- Java XML 概述
- Java XML 解析器
- Java DOM 解析器
- Java DOM 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java SAX 解析器
- Java SAX 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- JDOM XML 解析器
- JDOM XML 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java StAX 解析器
- Java StAX 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java XPath 解析器
- Java XPath 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java DOM4J 解析器
- Java DOM4J 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java XML 有用资源
- Java XML - 问题与解答
- Java XML - 快速指南
- Java XML - 有用资源
- Java XML - 讨论
Java SAX 解析器 - 修改 XML 文档
Java SAX 解析器是一个 Java API,可用于解析和修改 XML 文档。要使用 SAX 解析器修改任何 XML 文档,我们必须将数据存储在任何数据结构中,因为我们无法回退,因为它只有向前只读访问权限。在本章中,我们将详细了解如何读取和修改现有的 XML 文档。
使用 Java SAX 解析器修改 XML
- 步骤 1:实现 Handler 类
- 步骤 2:创建 SAXParser 对象
- 步骤 3:读取 XML
- 步骤 4:创建 Handler 类的对象
- 步骤 5:解析 XML 文档
- 步骤 6:将更新后的内容写入文件
请参考本节的解析 XML 文档章节了解前五个步骤。
步骤 6:将更新后的内容写入文件
可以使用 FileWriter 对象的 write() 方法将更新后的内容写入文件,如下所示:
FileWriter filewriter = new FileWriter("newfile.xml");
filewriter.write("content_here");
修改 XML 文件
SAX 解析器不会像 DOM 提供的那样提供对元素的随机访问。我们可以实现实现 DefaultHandler 的 Handler 类中的回调方法,以创建并将新元素添加到已存在的 XML 文档中。
示例
在这个示例中,我们将了解如何通过向 student 元素添加 result 元素来修改 studentData.xml 文件。以下是我们需要通过在 </marks> 标记的末尾附加 <Result>Pass<Result/> 来修改的studentData.xml 文件。
<?xml version = "1.0"?>
<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>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
在下面的ModifyXML.java 程序中,我们创建了 SAXParser 对象并解析了输入文件。我们已经使用必要的回调方法和 writeFile() 方法实现了 Handler 类,以将更新后的内容写入文件。我们使用了字符串数组来存储并将内容写入文件。
import java.io.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import org.xml.sax.helpers.DefaultHandler;
//Implementing a Handler class
class UserDemoHandler extends DefaultHandler {
static String displayText[] = new String[1000];
static int numberLines = 0;
static String indentation = "";
public void startDocument() {
displayText[numberLines] = indentation;
displayText[numberLines] += "<?xml version = \"1.0\" encoding = \""+
"UTF-8" + "\"?>";
numberLines++;
}
public void processingInstruction(String target, String data) {
displayText[numberLines] = indentation;
displayText[numberLines] += "<?";
displayText[numberLines] += target;
if (data != null && data.length() > 0) {
displayText[numberLines] += ' ';
displayText[numberLines] += data;
}
displayText[numberLines] += "?>";
numberLines++;
}
public void startElement(String uri, String localName, String qualifiedName,
Attributes attributes) {
displayText[numberLines] = indentation;
indentation += " ";
displayText[numberLines] += '<';
displayText[numberLines] += qualifiedName;
if (attributes != null) {
int numberAttributes = attributes.getLength();
for (int loopIndex = 0; loopIndex < numberAttributes; loopIndex++) {
displayText[numberLines] += ' ';
displayText[numberLines] += attributes.getQName(loopIndex);
displayText[numberLines] += "=\"";
displayText[numberLines] += attributes.getValue(loopIndex);
displayText[numberLines] += '"';
}
}
displayText[numberLines] += '>';
numberLines++;
}
public void characters(char characters[], int start, int length) {
String characterData = (new String(characters, start, length)).trim();
if(characterData.indexOf("\n") < 0 && characterData.length() > 0) {
displayText[numberLines] = indentation;
displayText[numberLines] += characterData;
numberLines++;
}
}
public void endElement(String uri, String localName, String qualifiedName) {
indentation = indentation.substring(0, indentation.length() - 4) ;
displayText[numberLines] = indentation;
displayText[numberLines] += "</";
displayText[numberLines] += qualifiedName;
displayText[numberLines] += '>';
numberLines++;
if (qualifiedName.equals("marks")) {
startElement("", "Result", "Result", null);
characters("Pass".toCharArray(), 0, "Pass".length());
endElement("", "Result", "Result");
}
}
public void writeFile(FileWriter filewriter) throws IOException {
for(int loopIndex = 0; loopIndex < numberLines; loopIndex++) {
filewriter.write(displayText[loopIndex].toCharArray());
filewriter.write('\n');
System.out.println(displayText[loopIndex].toString());
}
filewriter.close();
}
}
public class ModifyXML extends DefaultHandler {
public static void main(String args[]) {
try {
//Creating SAXParser object
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
//Reading the XML
File inputFile = new File("src/input.txt");
//Creating object for Handler class
UserDemoHandler userHandler = new UserDemoHandler();
//Parsing the XML
saxParser.parse(inputFile, userHandler);
//Writing the updated content into file
FileWriter filewriter = new FileWriter("src/newfile.xml");
userHandler.writeFile(filewriter);
}
catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
输出窗口显示在向每个 student 元素添加 result 元素后 XML 文档的更新内容。
<?xml version = "1.0" encoding = "UTF-8"?>
<class>
<student rollno = "393">
<firstname>
dinkar
</firstname>
<lastname>
kad
</lastname>
<nickname>
dinkar
</nickname>
<marks>
85
</marks>
<Result>
Pass
</Result>
</student>
<student rollno = "493">
<firstname>
Vaneet
</firstname>
<lastname>
Gupta
</lastname>
<nickname>
vinni
</nickname>
<marks>
95
</marks>
<Result>
Pass
</Result>
</student>
<student rollno = "593">
<firstname>
jasvir
</firstname>
<lastname>
singn
</lastname>
<nickname>
jazz
</nickname>
<marks>
90
</marks>
<Result>
Pass
</Result>
</student>
</class>
广告