【发布时间】:2010-10-28 20:30:57
【问题描述】:
我正在使用 SAX 解析器读取 XML 文件(这部分可以更改,这是有充分理由的)。
当我找到必要的属性时,我需要更改它们的值并将生成的 XML 文件另存为新文件。
我该怎么做?
【问题讨论】:
-
你能重新打开 XML 流吗?或者您是否可以在解析之前将数据存储在缓冲区中?
我正在使用 SAX 解析器读取 XML 文件(这部分可以更改,这是有充分理由的)。
当我找到必要的属性时,我需要更改它们的值并将生成的 XML 文件另存为新文件。
我该怎么做?
【问题讨论】:
Afaik,SAX 只是解析器。您必须选择不同的库来编写 XML。
如果您只是更改属性或更改元素名称而不更改 XML 的结构,那么这应该是相对容易的任务。使用 STaX 作为作家:
// Start STaX
OutputStream out = new FileOutputStream("data.xml");
XMLOutputFactory factory = XMLOutputFactory.newInstance();
XMLStreamWriter writer = factory.createXMLStreamWriter(out);
现在,扩展 SAX DefaultHandler:
startDocument(){
writer.writeStartDocument("UTF-8", "1.0");
}
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) {
writer.writeStartElement(namespaceURI, localName);
for(int i=0; i<atts.getLength(); i++){
writer.writeAttribute(atts.getQName(i), atts.getValue(i));
}
}
public void endElement(String uri, localName, qName){
writer.writeEndElement();
}
【讨论】:
如果您的文档相对较小,我建议使用JDOM。您可以实例化 SaxBuilder 以从 InputStream 创建 Document,然后使用 Xpath 查找要更改的节点/属性,进行修改,然后使用 XmlOutputter 将修改后的文档写回.
另一方面,如果您的文档太大而无法有效地保存在内存中(或者您不想使用第 3 方库),则您需要坚持使用 SAX 解析器,将节点流式传输出去在您阅读它们时将其写入磁盘,并在途中进行任何更改。
您可能还想看看 XSLT。
【讨论】: