Java standard lib produces incorrect xml 1.1

I found this interesting problem last week. Run the program below. It is very simple, first create a dummy xml file and read it with the standard library and write to the file.

Look at the created gtest2.xml file, you will see that it has content that came out of nowhere.

In my case, this is a sample of the wrong partition (the place changes on different machines).

<test>1924</test> <test>1925</test> <test>t&gt;24</test> <test>1927</test> <test>1928</test> <test>1929</test> 

This does not happen if I change the xml version to 1.0. So is something wrong with my code or jdk?

Here is the test code:

 import java.io.File; import java.io.PrintWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; 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; public class DocumentBuilderCheck { public static void main(String[] args) throws Exception { String filename = "/tmp/gtest.xml"; generateXmlFile(filename, 2500); Document doc = readXmlFile(filename); String filename2 = "/tmp/gtest2.xml"; writeDocument(doc, filename2); } private static void writeDocument(Document document, String filename) throws Exception { StreamResult streamResult = new StreamResult(filename); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); transformer.transform(new DOMSource(document), streamResult); } private static Document readXmlFile(String filename) throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File(filename)); return doc; } private static void generateXmlFile(String filename, int total) throws Exception { File f = new File(filename); PrintWriter pw = new PrintWriter(f); pw.write("<?xml version=\"1.1\" encoding=\"UTF-8\"?>"); pw.write("<main_tag>"); for (int i = 0; i < total; i++) { pw.write("<test>" + String.format("%04d", i) + "</test>"); } pw.write("</main_tag>"); pw.close(); } } 
+4
source share
1 answer

I don’t know what it gives, but one known problem (?) With the JDK is that it often includes an old version of libraries such as Xerces (XML parser) and Xalan (XSLT processor). Even worse, sometimes these are user versions that use the old version as the baseline and some fixes, so it's hard to even check what to expect.

As a result, the recommendations should not rely on anything related, but instead use the official versions of Xerces / Xalas explicitly to ensure that the version used is known, and you can at least check what known problems exist.

So, you can use the latest versions of Xerces and Xalan to ensure that this has not been fixed before.

+2
source

Source: https://habr.com/ru/post/1339594/


All Articles