我正在使用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记录。
答案 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")));