如何使用Perl的XML :: LibXML在XDM文档中找到特定节点?

时间:2015-08-13 12:31:34

标签: perl

您好我正在尝试使用XML :: LibXML在xdm文件中找到一些节点,我需要一些帮助。这是xdm

的一部分
<d:ctr name="Cpl">
    <d:var name="ModuleId" value="Cpl_TS_TxDxM3I0R0_"/>
    <d:var name="Enabled" value="TRUE"/>
    <d:var name="Generate" value="TRUE"/>
    <d:var name="Load" value="TRUE"/>
    <d:var name="Soft" value="3.0.2 B104427"/>
    <d:var name="URL" value="config\Cpl.xdm"/>
    <d:var name="Form" value="xdm"/>
    <d:var name="PreConfig" >
      <a:a name="IMPO" value="@DEF"/>
    </d:var>
    <d:var name="RecConfig" >
      <a:a name="IMPO" value="@DEF"/>
    </d:var>
  </d:ctr>
  <d:ctr name="CplShared">
    <d:var name="ModuleId" value="_TS_"/>
    <d:var name="Enabled" value="TRUE"/>
    <d:var name="Generate" value="TRUE"/>
    <d:var name="Load" value="TRUE"/>
    <d:var name="Soft" value="3.0.2 B104427"/>
    <d:var name="URL" 
           value="..\..\Common\config\CplShared.xdm"/>
    <d:var name="Form" value="xdm"/>
    <d:var name="PreConfig" >
      <a:a name="IMPO" value="@DEF"/>
    </d:var>
    <d:var name="RecConfig" >
      <a:a name="IMPO" value="@DEF"/>
    </d:var>

我想从moduleId节点中提取值。 findnodes似乎不起作用

foreach my $nodeArPackage ($xml_file->findnodes('//d:var'))
    {
        my $nameNodeFramePackage = $nodeArPackage->findnodes(name="ModuleId");

        print $nameNodeFramePackage;
    }

1 个答案:

答案 0 :(得分:1)

你的问题就在这一行:

my $nameNodeFramePackage = $nodeArPackage->findnodes(name="ModuleId");

这无效 - 如果您在strictwarnings下运行代码,则会发生错误。 (无论如何你应该这样做 - 这是非常好的做法)。

Bareword "name" not allowed at line ...

即使它不是,它仍然无法作为xpath表达式有效。看一下XML::Twig quick reference - 那里有关于xpath表达式的部分。

你可能想要的是:

my $nameNodeFramePackage = $nodeArPackage->findnodes('[@name="ModuleId"]');

虽然没有任何理由你不能将两者结合起来:

foreach my $nameNodeFramePackage ($xml_file->findnodes('//d:var[@name="ModuleId"]')) {
    print $nameNodeFramePackage;
}

(注意:XML::LibXML没有安装在我的Windows机器上,所以我还没有使用它来测试xpath。它适用于使用类似语法的XML::Twig < / p>

相关问题