我想将XML文件的一些片段存储在单独的文件中。 看来,没有办法直接做到: 阅读这些块失败了。
我总是得到例外 “javax.xml.transform.TransformerException:org.xml.sax.SAXParseException:根元素后面的文档中的标记必须格式正确。”
仅当只有一个'根'元素时才有效(不是 正常意义上的根元素。)
我理解具有多个“根”的XML格式不正确, 但它应该被视为一大块。
在建议一些解决方案之前,请告诉我: XML块是否有效?
如果是这样,是否可以使用标准JDK6 API读出它们?
测试代码:
String testChunk1 = "<e1>text</e1>";
String testChunk2 = "<e1>text</e1><e2>text</e2>";
// the following doesn't work with 'testChunk2'
StringReader sr = new StringReader(testChunk1);
StringWriter sw = new StringWriter();
TransformerFactory.newInstance().newTransformer().transform(
new StreamSource(sr), new StreamResult(sw));
System.out.println(sw.toString());
答案 0 :(得分:2)
W3C一直致力于为XML fragment interchange定义标准。我之所以提到这不是因为它是你问题的解决方案,但是看到有关如何处理这些事情的讨论肯定是相关的。
在.NET世界中,您可以使用XML片段,例如validate them against a schema。这表明值得在Java库中搜索类似的支持。
如果要使用XSLT转换此类片段,一种非常常见的方法是在它们周围放置一个包装器元素,然后它可以充当DOM的根。
答案 1 :(得分:1)
虽然我认为必须有某种方式,也许是kludgy,做你想做的事情,但我不知道有什么方法可以做到。正如您所发现的那样,标准XML解析器需要格式良好的XML。
如果要将XML作为许多单独的片段存储在不同的文件中,那么最好的方法是创建自己的Reader或InputStream,它实际上(在幕后)按顺序读取所有片段,然后将包装好的Reader或InputStream提供给变换器。这样,XML解析器可以看到单个XML文档,但您可以随意存储它。
如果您执行此类操作,则片段(第一个片段除外)无法以标准XML标头开头:
<?xml version="1.0" encoding="UTF-8" ?>
答案 2 :(得分:1)
在建议一些解决方案之前,请告诉我:XML块是否有效?
不是他们自己的权利。
您可以通过诸如实体引用之类的方法将它们(作为XML外部解析实体)包含在其他文档中,并且您可以使用DOM Level 3 LS的parseWithContext()(Java等方法)将它们解析为现有文档中的块。并不抱歉,但它们不是文档,因此任何需要完整文档的界面都不能接受它们。
Transformer需要一个完整的文档作为输入,因为XSLT适用于完整文档,并且会被包含零个或多个根元素的内容所混淆。通常的技巧是通过将文档包装在开始和结束标记中来创建单个根元素,但这确实意味着您不能拥有Eddie所提到的XML声明(*)。
(*:实际上它被包含在外部解析实体中时称为“文本声明”,但语法完全相同。)