我使用 Java 和 XSL 样式表从 XML 文件中检索值并将其输出到文本文件。
以下是使用的程序:
TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new File("transform.xsl"));
Transformer transformer = factory.newTransformer(xslt);
Source text = new StreamSource(new File("inputXML.txt"));
transformer.transform(text, new StreamResult(new File("output.txt"))) ;
但最近我发现我将要读取的 XML 文件将有 2 个根节点,而不是一个。所以我正在考虑进行字符串操作以编程方式添加我自己的根节点,这样我就可以避免以下错误:
错误:'文档中根元素后面的标记必须 格式良好。错误: 'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: 文档中根元素后面的标记必须是 格式良好。'
但是我无法对 javax.xml.transform.Source 进行任何字符串操作(强制转换不起作用)。 我不想使用中间文件来添加我的根节点,因为我担心这会导致成本高昂,因为我需要处理接近 50k XML 记录。
StreamSource有几个构造函数
Path inputPath = Paths.get("inputXML.txt");
String input = new String(Files.readAllBytes(inputPath,
StandardCharsets.UTF_8));
input = input.replaceFirst("<quasiroot", "<root>$0")
+ "</root>";
Source text = new StreamSource(new StringReader(input));
Files#readString
(自 Java 11 起):String input = Files.readAllString(inputPath);
请注意,在 Java 世界中,您有像 Xerces 这样的 XML 解析器,支持 外部实体,因此您可以简单地构造一个引用其他文件的文件,例如
<!DOCTYPE root [
<!ENTITY input SYSTEM "inputXML.txt">
]>
<root>&input;</root>
然后您需要做的就是加载该文件作为 XSLT 的源。不需要字符串操作,至少不需要操作整个 XML,如果需要,您可以直接将上面的内容构造为字符串,然后通过 StringReader 将其传递给 StreamSource,在其中将系统 id 设置为您的目录输入 XML:
String input = "inputXML.txt";
File dir = new File(".");
String baseUri = dir.toURI().toASCIIString();
String inputXml = "<!DOCTYPE root [ <!ENTITY input SYSTEM \"" + input + "\">]><root>&input;</root>";
TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new File("transform.xsl"));
Transformer transformer = factory.newTransformer(xslt);
Source text = new StreamSource(new StringReader(inputXml), baseUri);
transformer.transform(text, new StreamResult(new File("output.txt")));