我正在尝试创建一个简单的测试,以编程方式创建一个示例XML文档,将其写入文件,然后将其作为新实例读回以与原始实例进行比较。
但是,我遇到了一个问题,即新文档作为读回时的不同类的实例生成。
新文档= com.sun.org.apache.xerces.internal.dom.DocumentImpl
解析的文档= com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl
这意味着任何equals()调用来比较两者都将始终失败。我在这里想念东西吗?
下面的SSCCE:
import java.io.FileWriter;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Objects;
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;
/**
* Generate a sample XML Document,write it,read back in as a new instance,compare against original.
*/
public class SSCCE {
// XML file location
private static final Path LOCATION = Paths.get("C:\\Temp\\SAMPLE.XML");
// Does the stuff
public static void main(String[] args) {
try {
// New document
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
docFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document documentOut = docBuilder.newDocument();
documentOut.setXmlStandalone(true);
// New root element
Element root = documentOut.createElement("root");
documentOut.appendChild(root);
// Sample child nodes
for (int i = 1; i <= 5; i++) {
Node child = documentOut.createElement("child_" + Integer.toString(i));
root.appendChild(child);
}
// Write to file
writeXML(documentOut,LOCATION);
// Read back in
Document documentIn = readXML(LOCATION);
// Compare
boolean equals = Objects.equals(documentOut,documentIn);
System.out.println("Documents equals = " + equals);
System.out.println("OUT = " + documentOut.getclass().getcanonicalName());
System.out.println("IN = " + documentIn.getclass().getcanonicalName());
} catch (Exception exception) {
exception.printStackTrace(System.err);
}
}
// Write Document to file
public static void writeXML(Document document,Path location) throws Exception {
DOMSource source = new DOMSource(document);
FileWriter writer = new FileWriter(location.toFile());
StreamResult result = new StreamResult(writer);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(source,result);
}
// Read document from file
public static Document readXML(Path location) throws Exception {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(location.toFile());
return doc;
}
}