【问题标题】:Parse XML multi line string in Java在 Java 中解析 XML 多行字符串
【发布时间】:2012-05-13 10:25:05
【问题描述】:

我正在尝试使用经典 DOM 解析 Java 中的多行 XML 属性。解析工作得很好。但是,它会破坏换行符,因此,当我渲染解析的字符串时,换行符会被简单的空格替换。

<string key="help_text" value="This is a multi line long
                               text. This should be parsed
                               and rendered in multiple lines" />

获取我正在使用的属性:

attributes.getNamedItem("value").getTextContent()

如果我只是使用“\n”将手动输入的字符串传递给渲染方法,则文本会按预期绘制。

有什么想法吗?

【问题讨论】:

    标签: java xml parsing dom xml-parsing


    【解决方案1】:

    我过去曾为此使用过 JDom。它在解码多行属性时为您省去了很多麻烦,并真正增强了 Java 上的 XML 解析/编写。 JDom 还兼容 Android 开发,而且非常小(只有一个 jar 文件)。

    https://github.com/hunterhacker/jdom

    【讨论】:

    • 我用过第一个(而且很丑)“<br />”解决方案现在可以解决,但我肯定会研究 JDom。非常感谢。
    • @Fsero - 您能否简要描述一下您是如何使用 JDom 进行管理的?我刚刚编写了一个小型单元测试,甚至在进入 JDom 之前,属性中的换行符就在 Xerces 领域中被删除了。
    【解决方案2】:

    根据XML specification,XML 解析器必须规范化属性空白,例如用空格替换换行符。 IE。如果您需要保留换行符,则不能使用属性值。

    一般来说,XML 中的空白处理很麻烦。特别是,CR、LF 和 CRLF 之间的差异不会在任何地方保留。

    您可能会发现将属性中的换行符编码为&amp;lt;br /&amp;gt;(即&lt;br /&gt; 的编码版本)然后再解码它们会更好。

    【讨论】:

    • @Ben 根据 XML 规范 CR/LF 组合必须由 XML 处理器规范化为 LF。
    • 是的。因此,如果差异对您的应用程序很重要,您必须找到其他编码方式 - 您自己制作的特殊标签是理想的方法。
    【解决方案3】:

    来自the XML specifcation: 3.3.3 属性值规范化。你会看到所有的空格都被归一化为单个空格:

    在将属性的值传递给应用程序之前或 检查有效性,XML 处理器必须规范化属性 通过应用下面的算法或使用其他方法来获得价值 这样传递给应用程序的值与 算法产生的。所有换行符必须已标准化 如 2.11 行尾处理中所述,在输入到 #xA 时,其余部分 该算法对以这种方式规范化的文本进行操作。

    从一个由空字符串组成的规范化值开始。

    对于每个字符、实体引用或字符引用 未标准化的属性值,从第一个开始并继续 最后,执行以下操作:

    对于字符引用,将引用的字符附加到 标准化值。

    对于实体引用,递归地应用此算法的第 3 步到 实体的替换文本。

    对于空格字符(#x20、#xD、#xA、#x9),附加一个空格 字符 (#x20) 到标准化值。

    对于另一个字符,将该字符附加到标准化值。

    【讨论】:

      猜你喜欢
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 2012-12-04
      • 2012-12-18
      相关资源
      最近更新 更多