在存储在org.w3c.dom.Document中的给定XML文件的根元素周围添加元素

gro*_*rtn 0 java xml saxparser xml-parsing domparser

所以我想这样做.添加新的根元素并将旧元素包装在其中.

鉴于此作为起始条件

// this part uses SAXParser
org.w3c.com.Document = xmlSrc.parse(is); // *is* is InputStream 
Run Code Online (Sandbox Code Playgroud)

最初的条件不是真的可以谈判,但我也愿意听到那里的评论

所以给出了这个xml文件

<?xml version="1.0" encoding="UTF-8"?>
<root1>
   <elem>...</elem>
</root1>
Run Code Online (Sandbox Code Playgroud)

我需要在Java中生成一个InputStream,它将包含此格式的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<newroot>
   <root1>
       <elem>...</elem>
   </root1>
</newroot>
Run Code Online (Sandbox Code Playgroud)

存储在一些InputStream isNewXML中

我很好奇这是做什么的最好方法.我是Java新手,java有十亿种方法可以做同样的事情,所以在黑暗中这将是最好的

mil*_*ose 6

A Document也是Node- 根元素是文档的第一个也是唯一的子元素,您可以像操纵任何其他元素一样操纵Document的子节点:

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")));
Run Code Online (Sandbox Code Playgroud)

如果您需要处理DOM解析开销很大的文件,那么使用StAX也很容易.


jt.*_*jt. 5

使用示例输入,这将创建请求的输出。理想情况下,您将处理异常并正确关闭输入流,输出流和编写器:

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());

    }

}
Run Code Online (Sandbox Code Playgroud)