我正在尝试使用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
#
-&gt; show /HOST
/HOST
Targets:
bootmode
diag
domain ...."
其中一些值包含脚本执行的输出。当我尝试解析这些值时,我最终得到如下内容:
my $value = $log->findvalue('@value');
print "value: $value\n";
输出:
# Firmware level after downgrade # -&gt; show /HOST /HOST Targets: bootmode diag domain ....
我似乎无法找到让LibXML尊重新行的任何方法。有什么想法吗?
答案 0 :(得分:4)
XML 1.0 Specification表示属性值(空格,CR,LF,制表符)中的任何空格字符必须在处理前转换为空格
不幸的是,任何正常工作的XML处理器都会给你带来同样的问题
这是非常奇怪的XML。它从哪里来的? value
属性应该真正显示为PCDATA,以便可以正确处理。你有什么办法可以改变你得到的数据吗?
如果有任何方法可以预处理数据,以便用字符引用

替换换行符,那么在处理数据时它们将被转换为LF字符。这真的应该通过生成XML
答案 1 :(得分:3)
Attribute-Value Normalization 的XML spec部分要求 XML::LibXML展示的行为。
对于空格字符(#x20,#xD,#xA,#x9),请在标准化值后附加空格字符(#x20)。
没有documented选项可以更改此行为。
如果属性值包含换行符,则必须使用

或类似内容而不是实际换行符。