2010-10-28 68 views
3

我正在阅读一个SAX解析器的XML文件(这部分可以改变它,这是一个很好的理由)。如何更改XML文件中某些元素和属性的值[Java]?

当我找到必要的属性时,我需要更改它们的值并将生成的XML文件保存为新文件。

我该怎么做?

+0

你能重新打开XML流?或者是否有可能在解析之前将数据存储在缓冲区中? – Ramp 2010-10-28 21:09:11

回答

7

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(); 
} 
+0

谢谢,我明白了。我不确定我会用它(也许我更喜欢一些图书馆),但这就是我所要求的。 – Roman 2010-10-29 05:17:06

2

如果你的文件比较小,我推荐使用JDOM。您可以实例化SaxBuilder以从InputStream创建Document,然后使用Xpath查找要更改的节点/属性,进行修改,然后使用XmlOutputter将修改后的文档写回去。另一方面,如果你的文档太大而不能有效地保存在内存中(或者你不想使用第三方库),那么你需要坚持使用SAX解析器,节点读取到磁盘上,在路上进行任何更改。

您可能还想看看XSLT。