上周我发现了这个有趣的问题。运行以下程序。这很简单,首先创建一个虚拟的xml文件,然后用标准的lib读取它并将其写回文件。
查看生成的gtest2.xml,您会发现它有一些无处不在的内容。
在我的情况下,这是错误部分的样本(不同机器上的地方不同)。
<test>1924</test>
<test>1925</test>
<test>t>24</test>
<test>1927</test>
<test>1928</test>
<test>1929</test>
如果我将xml版本更改为1.0,则不会发生这种情况。我的代码或jdk有问题吗?
这是测试代码:
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();
}
}
答案 0 :(得分:2)
我不知道是什么给了,但JDK的一个众所周知的(?)问题是它经常包括旧版本的库,如Xerces(XML解析器)和Xalan(XSLT处理器)。更糟糕的是,有时这些是使用旧版本作为基线的自定义版本,以及一些补丁集,因此很难验证预期的结果。
因此,建议不要依赖捆绑的任何内容,而是明确使用官方的Xerces / Xalas版本来确保使用的版本是已知的,并且您至少可以检查存在哪些已知问题。
所以也许你可以使用最新的Xerces和Xalan版本来确保它不是早先修复过的。