【发布时间】:2019-08-14 09:42:23
【问题描述】:
我有这个 XML 文件,我需要一次访问一个特定节点。下面是我的 XML 示例以及示例代码。
我的代码工作正常,只是我循环遍历所有消息/内容标签,而不是只获取当前消息标签下的特定消息/内容标签。例如,当我只希望返回 1 个 () 时,我会在处理当前消息标签(带有 refid="123991123" 的那个)时返回 3 个消息/内容标签。希望这是有道理的。如有任何帮助,我们将不胜感激。
代码:
my $twig = XML::Twig->new(
twig_handlers => {
Selection => sub {
foreach my $message ($_->findnodes('./Contents/Message')) {
if($message->att('custom')){
$Message_custom = $message->att('custom');
foreach my $Content ($_->findnodes('./Contents/Message/Content')) {
print $Selection_id.": ".$Message_refid.": ".$TotalContents++."\n";
if($Content->att('language') eq "en"){
if($Content->att('imagelibraryid')){
$Message_Content_language_en_imagelibraryid = $Content->att('imagelibraryid');
}else{
$Message_Content_language_en = substr($message->field('Content'), 0, 20);
}
}
}
}
}
},
}
);
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Selection id="54008473">
<Name>Master</Name>
<Contents>
<Message refid="125796458" suppress="true" status="Unchanged"/>
<Message refid="123991123" suppress="true" status="Unchanged">
<Content language="en" imagelibraryid="5492396"/>
</Message>
<Message refid="128054778" custom="true" status="New">
<Content language="en"><![CDATA[<p>Some English content</p>]]></Content>
<Content language="fr"><![CDATA[<p>Some French content</p>]]></Content>
</Message>
</Contents>
</Selection>
<Selection id="54008475" datavaluerefid="54008479">
<Name>RMBC</Name>
<Contents>
<Message refid="125796458" sameasparent="true" parentrefid="54008473" status="Unchanged"/>
<Message refid="123991123" sameasparent="true" parentrefid="54008473" status="Unchanged"/>
<Message refid="128054778" custom="true" status="New">
<Content language="en"><![CDATA[<p>ada</p>]]></Content>
</Message>
</Contents>
</Selection>
</Root>
【问题讨论】:
-
您的代码不会在严格/警告下编译,并且永远不会设置
$Message_refid。请修复此问题,以便对其进行调试。 -
我很难理解你想让你的代码做什么。你想获得什么输出?