Java 在存储在org.w3c.dom.Document中的给定XML文件的根元素周围添加一个元素
所以我正在努力做到这一点。添加新的根元素并在其中包装旧的根元素 以此为出发条件Java 在存储在org.w3c.dom.Document中的给定XML文件的根元素周围添加一个元素,java,xml,xml-parsing,saxparser,domparser,Java,Xml,Xml Parsing,Saxparser,Domparser,所以我正在努力做到这一点。添加新的根元素并在其中包装旧的根元素 以此为出发条件 // this part uses SAXParser org.w3c.com.Document = xmlSrc.parse(is); // *is* is InputStream 最初的条件并不是可以商量的,但我也愿意听取意见 给定这个xml文件 <?xml version="1.0" encoding="UTF-8"?> <root1> <elem>...</
// this part uses SAXParser
org.w3c.com.Document = xmlSrc.parse(is); // *is* is InputStream
最初的条件并不是可以商量的,但我也愿意听取意见
给定这个xml文件
<?xml version="1.0" encoding="UTF-8"?>
<root1>
<elem>...</elem>
</root1>
...
我需要在Java中生成一个InputStream,其中包含这种格式的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<newroot>
<root1>
<elem>...</elem>
</root1>
</newroot>
...
存储在某些InputStream中的是NewXML
我很好奇做这件事的最佳方式是什么。
我不熟悉Java,Java有十亿种方法可以在黑暗中完成同样的事情,这是最好的A
文档
也是一个节点
–根元素是文档的第一个子元素,也是唯一的子元素,您可以像其他任何元素一样操作文档的子节点:
Document doc = parser.parse(new File("build.xml"));
Element newRoot = doc.createElement("newroot");
newRoot.appendChild(doc.getFirstChild());
doc.appendChild(newRoot);
// output to wrapped.xml
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult(new File("wrapped.xml")));
如果您需要处理DOM解析开销很大的文件,那么使用StAX也很容易做到这一点。使用示例输入,这将创建请求的输出。理想情况下,您应该正确处理异常并关闭inputstreams、output streams和Writer:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class XmlTest
{
public static void main(String[] args) throws Exception
{
InputStream is = new FileInputStream("test.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document oldDoc = builder.parse(is);
Node oldRoot = oldDoc.getDocumentElement();
Document newDoc = builder.newDocument();
Element newRoot = newDoc.createElement("newroot");
newDoc.appendChild(newRoot);
newRoot.appendChild(newDoc.importNode(oldRoot, true));
ByteArrayOutputStream out = new ByteArrayOutputStream();
DOMSource domSource = new DOMSource(newDoc);
Writer writer = new OutputStreamWriter(out);
StreamResult result = new StreamResult(writer);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.transform(domSource, result);
writer.flush();
InputStream isNewXML = new ByteArrayInputStream(out.toByteArray());
}
}
这可能会有帮助
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class WriteXMLFile {
public static void main(String argv[]) {
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
// root elements
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("root");
doc.appendChild(rootElement);
// write the content into xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("build.xml"));
// Output to console for testing
// StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
System.out.println("File saved!");
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
} catch (TransformerException tfe) {
tfe.printStackTrace();
}
}
}
这缺少某些步骤,因为您输出了从未更改过的文档。。。此外,原始xml可以有多个嵌套element@grobartn你真的试过这个密码吗?我想你不明白它是如何工作的。我只是找到了同样的解决方案,刚刚完成了让它为我工作,但它与你的原理完全相同,所以将它标记为答案。。谢谢如果你想知道我在哪里找到了几乎相同的解决方案……实际上,最简单的解决方案可能是使用BufferedReader读取InputStream,然后(通过Writer)写入新的OutputStream。您只需在读取第一行和最后一行之后编写新的根标记。通过这种方式,您可能可以减少大量内存使用。