【问题标题】:How to keep the whitespaces when reading an attribute value with libxml2使用 libxml2 读取属性值时如何保留空格
【发布时间】:2013-01-25 22:14:03
【问题描述】:

我使用 libxml2 来解析我的 XML 配置文件。最新的功能请求涉及“正确处理有意义的空白”,例如应该保留换行符。

目前我使用xmlGetProp 获取属性值。

我知道空格通常由 XML 解析器规范化——正如标准所要求的那样(用空格字符替换所有空格,融合多个空格字符,去除前导和尾随空格字符)。

我想知道是否有一种方法可以确保保留属性中嵌入的换行符。

  • 我可以使用不同的 libxml2 功能来解析保留空格的 XML 属性吗?
  • 是否有任何 DTDschema 方法可以使 libxml2 做到这一点?目前我不使用这些。

【问题讨论】:

    标签: xml schema whitespace dtd libxml2


    【解决方案1】:

    你试过xml:space属性还是xmlNodeGetSpacePreserve()

    <para xml:space="preserve">

    见:

    1. xmlNodeGetSpacePreserve() @ LibXML documentation;
    2. XML to preserve the whitespace;
    3. White Space @ MSDN

    【讨论】:

    • 呃,有趣。不,我没有尝试过,但仍然很有趣。唉,我确实有一个 attribute 而不是一个带有文本内容(或 PCDATA 或 CDATA)的 element。在我可以将这些可怕的属性提升为具有内容的元素之前,我可能会在属性中放置一个 URI,然后在外部加载包含空间的东西,可以这么说。但如果有一个“属性方式”,我可能不会这样做。
    • xml:space 不会在属性值中保留换行符。根据rules for Attribute-Value Normalization,有必要将换行符编码为#xA;,以便在xml 解析过程中安然无恙。原始换行符将变成空格。对于类型不是 CDATA 的属性,会发生进一步的规范化(连续空格的修剪和折叠)。 (CDATA 是默认的属性类型。)
    【解决方案2】:

    正如您注意到的,这是 XML 规范所要求的,因此在 DTD 或 Schema 中无法停止规范化。

    你或许可以使用 libxml 的 html 解析器,使用它的命令行 xmllint 实用程序和输入文件

    <a>
    <b x="1
    2
    3"/>
    </a>
    

    我明白了

    $ xmllint abc.xml
    <?xml version="1.0"?>
    <a>
    <b x="1 2 3"/>
    </a>
    

    所以换行符已经消失了,但是:

    $ xmllint --html abc.xml
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
    <html><body><a>
    <b x="1
    2
    3"></b>
    </a></body></html>
    

    保留换行符(添加了虚假推断的 html 和正文,但您可能会在应用程序解析后丢失它们)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2011-11-10
      • 2014-01-13
      • 2023-02-01
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多