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

时间:2017-08-07 15:41:06

标签: java xml xslt

我正在使用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:The   必须是根元素后面的文档中的标记   合式'。

但是我无法对javax.xml.transform.Source执行任何字符串操作(Casting不起作用)。 我不想使用中间文件来添加我的根节点,因为我担心它会变得很昂贵,因为我需要处理接近50k的XML记录。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

请注意,在Java世界中,您拥有Xerces等XML解析器,并支持external entities,因此您只需构建一个引用其他文件的文件,例如:

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