使用Perl的LibXML解析带换行符/换行符的XML

时间:2012-08-23 20:38:36

标签: xml perl libxml2

我正在尝试使用Perl的XML::LibXML模块解析一系列XML文件。

<log date="2012-08-07 18:05:44.0" level="unit" label="2G-or-3G-server" name="unitnote" value="# Firmware level after downgrade
#
-&amp;gt; show /HOST

 /HOST
    Targets:
        bootmode
        diag
        domain ...."

其中一些值包含脚本执行的输出。当我尝试解析这些值时,我最终得到如下内容:

my $value  = $log->findvalue('@value');
print "value: $value\n";

输出:

# Firmware level after downgrade    #   -&amp;gt; show /HOST  /HOST  Targets:      bootmode        diag        domain ....

我似乎无法找到让LibXML尊重新行的任何方法。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

XML 1.0 Specification表示属性值(空格,CR,LF,制表符)中的任何空格字符必须在处理前转换为空格

不幸的是,任何正常工作的XML处理器都会给你带来同样的问题

这是非常奇怪的XML。它从哪里来的? value属性应该真正显示为PCDATA,以便可以正确处理。你有什么办法可以改变你得到的数据吗?

如果有任何方法可以预处理数据,以便用字符引用&#xA;替换换行符,那么在处理数据时它们将被转换为LF字符。这真的应该通过生成XML

的任何方式来完成

答案 1 :(得分:3)

Attribute-Value Normalization XML spec部分要求 XML::LibXML展示的行为。

  

对于空格字符(#x20,#xD,#xA,#x9),请在标准化值后附加空格字符(#x20)。

没有documented选项可以更改此行为。

如果属性值包含换行符,则必须使用&#x0A;或类似内容而不是实际换行符。