Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改XML文件[Java]中某些元素和属性的值?_Java_Xml_Sax - Fatal编程技术网

如何更改XML文件[Java]中某些元素和属性的值?

如何更改XML文件[Java]中某些元素和属性的值?,java,xml,sax,Java,Xml,Sax,我正在用SAX解析器读取一个XML文件(这一部分可以更改,这是有充分理由的) 当我找到必要的属性时,我需要更改它们的值并将结果XML文件保存为新文件 我该怎么做 如果您的文档相对较小,我建议使用。您可以实例化从InputStream创建,然后使用查找要更改的节点/属性,进行修改,然后使用将修改后的文档写回 另一方面,如果您的文档太大,无法有效地保存在内存中(或者您不希望使用第三方库),您将希望继续使用SAX解析器,在读取节点时将节点流式输出到磁盘,并在读取过程中进行任何更改 您可能还想看看XSL

我正在用SAX解析器读取一个XML文件(这一部分可以更改,这是有充分理由的)

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


我该怎么做

如果您的文档相对较小,我建议使用。您可以实例化从InputStream创建,然后使用查找要更改的节点/属性,进行修改,然后使用将修改后的文档写回

另一方面,如果您的文档太大,无法有效地保存在内存中(或者您不希望使用第三方库),您将希望继续使用SAX解析器,在读取节点时将节点流式输出到磁盘,并在读取过程中进行任何更改


您可能还想看看XSLT。

好的,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();
} 
startDocument(){
writeStartDocument(“UTF-8”、“1.0”);
}
public void startElement(字符串namespaceURI、字符串localName、,
字符串(名称、属性和附件){
WriteStarteElement(namespaceURI、localName);

对于(int i=0;i)您可以重新打开XML流吗?或者您可以在解析之前将数据存储在缓冲区中吗?