对于我的生活,我似乎无法弄清楚这一点。
我得到了以下示例文件:
<?xml version="1.0" encoding="utf-8"?>
<Datafile>
<Contract>
<A>234</A>
<B>234</B>
<C>2fs4</C>
</Contract>
<Contract>
<A>234</A>
<B>21</B>
<C>2fs4</C>
</Contract>
<Contract>
<A>23V</A>
<B>234</B>
<e/>
<C>2fs4</C>
</Contract>
<Contract>
<A>234</A>
<B>234</B>
<e/>
<C>2fs4</C>
<d>234</d>
</Contract>
<Contract>
<A>2343</A>
<B>234</B>
<e/>
<C>2fs4</C>
<d>3kv</d>
</Contract>
</Datafile>
我想得到每个标签的元素值:比如A的值,即234,234,23V ......依此类推。
这是我到目前为止所得到的:
use XML::DOM;
my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile ("./sample.xml");
my $nodes = $doc->getElementsByTagName ("Contract");
my $n = $nodes->getLength;
for (my $i = 0; $i < $n; $i++)
{
my $node = $nodes->item ($i); #returns one of the Contracts's array hash
#print $node->getValue . "\n";
#print $node;
#print $node->toString . "\n";
foreach $myelement ($node->getChildNodes){
#print $myelement . "\n";
#print $myelement->toString . "\n"; #prints to string each childnode
#print $myelement->getNodeName() . "\n"; #prints the element tag itself
print $myelement->getNodeValue() . "bla \n";#doesn't print a thing
}
}
正如您所看到的,这个想法非常简单。 getElementsByTagName将返回一份Contract列表。然后我使用for循环逐步查看Contract列表。然后在每个合同中我得到子节点,A,B,C等。但是后来我被卡住了。我在search.cpan.org上尝试了几种关于XML :: DOM的方法,我不断得到的是散列的东西,而不是实际的文本值。
我找到了一个需要xml :: dom :: lite的示例,虽然它可以在我的笔记本电脑上工作但它在我的办公室计算机上不起作用,因为我没有sudo来安装xml :: dom :: lite。它似乎只有xml :: dom和xml :: parser。