【发布时间】:2011-07-20 05:11:39
【问题描述】:
我有以下 test.xml:
<root>
<A title="A1">
<B title="B1">
<C title="C1">
<params>param=ABC1</params>
<params>param=ABC2</params>
</C>
</B>
</A>
<D title="D1">
<B title="B2">
<C title="C2">
<params>param=DBC1</params>
<params>param=DBC2</params>
</C>
</B>
</D>
</root>
我需要一个 perl 代码来解析它并将报告打印为:
NdeName, Attribute(s), Param(s)
A A1
B B1
C C1 param=ABC1 param=ABC2
D D1
B B2
C C2 param=DBC1 param=DBC2
我曾尝试使用getElementByTagName('param') 和getNodeChilds 等...但没有成功。另外,我一直在使用的是XML::DOM 模块。
代码如下:
use XML::DOM;
my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile("test.xml");
my @paramarray=();
ParseXML($doc,"");
sub ParseXML{
my $node = $_[0];
my $indent = $_[1];
my $title;
if ($node == null) {
return;
}
my $type = $node->getNodeType();
if ($type == DOCUMENT_NODE) {
ParseXML($node->getFirstChild(),"");
break;
}
if ($type == ELEMENT_NODE) {
$numberAttributes =0;
if ($node->getAttributes() !=null){
$numberAttributes = $node->getAttributes()->getLength();
}
for ($loopIndex =0; $loopIndex<$numberAttributes; $loopIndex++) {
$attribute = ($node->getAttributes())->item($loopIndex);
if($attribute->getNodeName() eq "title"){
$title = $attribute->getNodeValue();
}
}
if ($node->getNodeName() eq "params"){
foreach my $paramvar ($doc->getElementsByTagName("params")) {
foreach my $child ($paramvar->getChildNodes) {
push(@paramarray, $child->getData);
}
}
}
if ($node->getNodeName() ne "root") {
print $node->getNodeName. ", $title, @paramarray\n";
@paramarray=();
}
my @childNodes = $node->getChildNodes()
if (@childNodes != null){
my $numberChildNodes = $#childNodes + 1;
my $loopIndex;
for ($loopIndex =0; $loopIndex<$numberChildNodes; $loopIndex++) {
ParseXML($childNodes[$loopIndex],$indent);
}
}
}
if ($type == TEXT_NODE) {
my $nodeText = $node->getNodeValue();
}
}
【问题讨论】:
-
请发布您目前编写的代码,即使它不能正常工作。