以下只是我正在处理的XML的一小部分。我想提取子树下的所有属性,标签名称和文本。
<?xml version='1.0' encoding='UTF-8'?>
<Warehouse>
<Equipment id="ABC001" model="TV" version="3_00">
<attributes>
<Location>Chicago</Location>
<Latitude>30.970</Latitude>
<Longitude>-90.723</Longitude>
</attributes>
</Equipment></Warehouse>
我编写了这样的例子:
#!/usr/bin/perl
use XML::LibXML;
use Data::Dumper;
$parser = XML::LibXML->new();
$Chunk = $parser->parse_file("numone.xml");
@Equipment = $Chunk->findnodes('//Equipment');
foreach $at ($Equipment[0]->getAttributes()) {
($na,$nv) = ($at -> getName(),$at -> getValue());
print "$na => $nv\n";
}
@Equipment = $Chunk->findnodes('//Equipment/attributes');
@Attr = $Equipment[0]->childNodes;
print Dumper(@Attr);
foreach $at (@Attr) {
($na,$nv) = ($at->nodeName, $at->textContent);
print "$na => $nv\n";
}
我得到的结果如下:
id => ABC001
model => TV
version => 3_00
$VAR1 = bless( do{\(my $o = 10579528)}, 'XML::LibXML::Text' );
$VAR2 = bless( do{\(my $o = 13643928)}, 'XML::LibXML::Element' );
$VAR3 = bless( do{\(my $o = 13657192)}, 'XML::LibXML::Text' );
$VAR4 = bless( do{\(my $o = 13011432)}, 'XML::LibXML::Element' );
$VAR5 = bless( do{\(my $o = 10579752)}, 'XML::LibXML::Text' );
$VAR6 = bless( do{\(my $o = 10565696)}, 'XML::LibXML::Element' );
$VAR7 = bless( do{\(my $o = 13046400)}, 'XML::LibXML::Text' );
#text =>
Location => Chicago
#text =>
Latitude => 30.970
#text =>
Longitude => -90.723
#text =>
提取属性似乎没问题,但提取标签名称和文本有额外的内容。 我的问题是:
::Text
元素来自哪里? #text
事物?谢谢,
答案 0 :(得分:3)
额外节点是仅包含空格的文本节点,例如,元素之间的换行符。如果你愿意,可以跳过它们:
@Equipment = $Chunk->findnodes('//Equipment/attributes');
@Attr = $Equipment[0]->childNodes;
foreach $at (@Attr) {
($na,$nv) = ($at->nodeName, $at->textContent);
next if $na eq "#text"; # skip text nodes between elements
print "$na => $nv\n";
}
输出:
id => ABC001 model => TV version => 3_00 Location => Chicago Latitude => 30.970 Longitude => -90.723
答案 1 :(得分:3)
首先,您应该在程序开始时use strict
和use warnings
,并在my
首次使用时声明所有变量。这将揭示许多简单的错误,在您寻求帮助的计划中尤为重要。
正如您所知,XML::LibXML::Text
条目是空白文本节点。如果您希望XML::LibXML
解析器忽略,那么在解析器对象上设置no_blanks
选项。
此外,您最好使用较新的load_xml
方法而不是过时的parse_file
,如下所示
my $parser = XML::LibXML->new(no_blanks => 1);
my $Chunk = $parser->load_xml(location => "numone.xml");
此程序更改版本的输出类似于
id => ABC001
model => TV
version => 3_00
$VAR1 = bless( do{\(my $o = 7008120)}, 'XML::LibXML::Element' );
$VAR2 = bless( do{\(my $o = 7008504)}, 'XML::LibXML::Element' );
$VAR3 = bless( do{\(my $o = 7008144)}, 'XML::LibXML::Element' );
Location => Chicago
Latitude => 30.970
Longitude => -90.723