javax.xml.transform.Source 的字符串操作

问题描述 投票:0回答:2

我使用 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 记录。

java xml xslt
2个回答
4
投票

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);

0
投票

请注意,在 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")));
© www.soinside.com 2019 - 2024. All rights reserved.