inserting/appending 根节点之前和 org.w3c.dom 序言之后的评论问题

Problem with inserting/appending comment before root node and after prolog with org.w3c.dom

我试图在 xml 文档的第一个节点之前插入带有语法版本信息的注释,但由于某种原因,它总是附加在最后一个元素之后。我不能使用其他库,例如 XStream 等。

我已经尝试通过 append 和 insertBefore 方法执行此操作,但它们都产生相同的结果。是否可以仅使用普通文档、注释和节点来执行此操作,还是我必须使用转换器?

      Document doc = XmlDocumentUtil.createDocument();

      //Create root node
      Node rootNode = doc.createElement(NODE_DATA_CONFIGURATION);
      doc.appendChild(rootNode);

      //Create syntax identification comment
      Comment syntaxIdentification = doc.createComment(writeSyntaxIdentificationQE);
      doc.insertBefore(syntaxIdentification, rootNode);

      //Create revision information
      Element modificationNumber = doc.createElement("modificationNumber");
      modificationNumber.setTextContent(String.valueOf(configTable.getModificationNumber()));
      rootNode.appendChild(modificationNumber);

      Element modificationTime = doc.createElement("modificationTime");
      modificationTime.setTextContent(configTable.getModificationTime());
      rootNode.appendChild(modificationTime);

      Element modifier = doc.createElement("modifier");
      modifier.setTextContent(configTable.getModifier());
      rootNode.appendChild(modifier);

      for (...) {
         ... some data generation
      }

我得到的:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<DataConfiguration>
    <modificationNumber>2</modificationNumber>
    <modificationTime>2019-07-25 07:42:28.804 +0200</modificationTime>
    <modifier>testuser</modifier>
    <someData idxFrom="4" idxTo="9"
        signalName="1" signalOffset="273.15" signalTemplate="asdf" skip="Y"/>
</DataConfiguration>
<!--SyntaxIdentification: 1.0-->

我需要的:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--SyntaxIdentification: 1.0-->
<DataConfiguration>
    <modificationNumber>2</modificationNumber>
    <modificationTime>2019-07-25 07:42:28.804 +0200</modificationTime>
    <modifier>testuser</modifier>
    <someData idxFrom="4" idxTo="9"
        signalName="1" signalOffset="273.15" signalTemplate="asdf" skip="Y"/>
</DataConfiguration>

对我来说,您的代码总体上看起来不错。似乎您只缺少文本节点。

这是完整的工作代码。

package xml;

import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
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.*;

public class XMLComment {

    public static void main(String[] args) throws ParserConfigurationException, TransformerException {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.newDocument();

        // Create root node
        Node rootNode = doc.createElement("DataConfiguration");
        doc.appendChild(rootNode);

        // Create syntax identification comment
        Comment syntaxIdentification = doc.createComment("SyntaxIdentification: 1.0");
        doc.insertBefore(syntaxIdentification, rootNode);

        // Create modificationNumber
        Node modificationNumber = doc.createElement("modificationNumber");
        Text mnText = doc.createTextNode("123456");
        modificationNumber.appendChild(mnText);

        // Create modificationTime
        Element modificationTime = doc.createElement("modificationTime");
        Text mtText = doc.createTextNode("2019-07-25 07:42:28.804 +0200");
        modificationTime.appendChild(mtText);

        rootNode.appendChild(modificationNumber);
        rootNode.appendChild(modificationTime);
        printXML(doc);

    }

    private static void printXML(Document doc) throws TransformerException {
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
        // initialize StreamResult with File object to save to file
        StreamResult result = new StreamResult(new StringWriter());
        DOMSource source = new DOMSource(doc);
        transformer.transform(source, result);
        String xmlString = result.getWriter().toString();
        System.out.println(xmlString);
    }
}

它将输出,接近您要查找的内容。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--SyntaxIdentification: 1.0--><DataConfiguration>
  <modificationNumber>123456</modificationNumber>
  <modificationTime>2019-07-25 07:42:28.804 +0200</modificationTime>
</DataConfiguration>

希望对您有所帮助。