【问题标题】:Are XML chunks valid?XML 块是否有效?
【发布时间】:2009-03-10 22:41:05
【问题描述】:

我想将 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());

【问题讨论】:

    标签: java xml validation


    【解决方案1】:

    W3C 一直致力于为XML fragment interchange 定义标准。我提到它并不是因为它可以解决您的问题,但看到关于如何处理此类事情的讨论绝对是相关的。

    在 .NET 世界中,您可以使用 XML 片段,例如,validate them against a schema。这表明值得在 Java 库中搜索类似的支持。

    如果您想使用 XSLT 转换此类片段,一种非常常见的方法是在它们周围放置一个包装器元素,然后它可以充当 DOM 的根。

    【讨论】:

    • XML 片段交换的“当前”版本是从 2001 年开始的,并且仍然是“候选推荐”(自 8 年以来!)。所以,我认为 W3C 在这方面没有进一步的工作可以期待。我找不到 W3C 关于类似主题的其他标准提案。你知道任何?谢谢。
    【解决方案2】:

    虽然我认为必须有某种方法,也许是笨拙的,来做你想做的事,但我不知道有什么方法可以做到。正如您所发现的,标准 XML 解析器需要格式良好的 XML。

    如果您想将您的 XML 作为多个单独的片段存储在不同的文件中,那么最好的方法可能是创建您自己的 Reader 或 InputStream,它实际上(在幕后)按顺序读取所有片段,然后将包装好的 Reader 或 InputStream 提供给转换器。这样,XML 解析器会看到单个 XML 文档,但您可以随意存储它。

    如果你这样做,片段(除了第一个)不能以标准 XML 头开始:

    <?xml version="1.0" encoding="UTF-8" ?>
    

    【讨论】:

    • 实际上他可以创建一些 InputStream 来读取带有和不带有 XML 标头的 XML 文件,并将它们组合成一个带有标头的 XML 文件。
    • 我在考虑这个问题,但这就是我所说的解决方案;)我想我会将此作为最后的选择。
    【解决方案3】:

    在提出一些变通解决方案之前,请告诉我:XML 块是否有效?

    不是他们自己的权利。

    您可以通过实体引用等方法将它们(作为 XML 外部解析实体)包含在其他文档中,并且可以使用诸如 DOM Level 3 LS 的 parseWithContext()(Java不给你,抱歉),但它们不是文档,因此任何需要完整文档的界面都无法接受它们。

    Transformer 需要完整的文档作为输入,因为 XSLT 可以处理完整的文档,并且会被包含零个或多个根元素的内容混淆。通常的技巧是通过将文档包装在开始和结束标记中来创建单个根元素,但这确实意味着您不能像 Eddie 所提到的那样拥有 XML 声明 (*)。

    (*:实际上它包含在外部解析实体中时称为“文本声明”,但语法完全相同。)

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 2022-01-02
      • 2013-02-02
      • 1970-01-01
      相关资源
      最近更新 更多