Добавьте элемент вокруг корневого элемента данного XML-файла, который хранится в org.w3c.dom.Document - PullRequest
0 голосов
/ 30 ноября 2011

Так что я пытаюсь это сделать.Добавьте новый корневой элемент и оберните в него старый.

Учитывая это как начальное условие

// 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 isNewXML

Мне любопытно, как лучше всего это сделать.Я новичок в Java, и у Java есть миллиард способов сделать то же самое в темноте, что будет лучшим

Ответы [ 3 ]

6 голосов
/ 30 ноября 2011

A Document также является Node - корневой элемент является первым и единственным дочерним элементом документа, и вы можете манипулировать дочерними узлами документа, как и любые другие:

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

Это также будет довольно легко сделать с StAX, если вам когда-нибудь понадобится обрабатывать файлы, в которых затраты на анализ DOM будут значительными.

5 голосов
/ 30 ноября 2011

Используя ваш пример ввода, это создает запрошенный вывод. В идеале вы должны обрабатывать исключения и правильно закрывать входные потоки, выходные потоки и средства записи:

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

    }

}
0 голосов
/ 10 июля 2016

Это может помочь

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