XML名称空间和变量元素名称

XML名称空间和变量元素名称,xml,perl,xpath,libxml2,Xml,Perl,Xpath,Libxml2,我的XML: 我正在使用$pos查找元素的正确顺序 my $ptag=measInfo; my $ktag=measType; my $vtag=measValue; my $whr="CPUUSAGE"; my $mn="measObjLdn"; my $rng='bsNo=18'; 用于我的$type\u节点($conn->findnodes(“//\*[name()='$ptag'][\*[name()='$ktag'][.='$whr']])){ $pos=$type_node->fi

我的XML:

我正在使用
$pos
查找
元素的正确顺序

my $ptag=measInfo;
my $ktag=measType;
my $vtag=measValue;
my $whr="CPUUSAGE";
my $mn="measObjLdn";
my $rng='bsNo=18';
用于我的$type\u节点($conn->findnodes(“//\*[name()='$ptag'][\*[name()='$ktag'][.='$whr']])){
$pos=$type_node->findvalue(“计数(前面的同级::$ktag)+1”);
$qry=移除ChildNodes;
$r_节点->追加文本($new_值);
}
}

Q> 什么都不管用。这可能是一个愚蠢的错误???

不确定这是否正是您想要的,但名称空间的使用和xpath可能会有所帮助

for my $type_node ($conn->findnodes("//\*[name()='$ptag'][\*[name()='$ktag'][.='$whr']]")) {
    $pos = $type_node->findvalue("count(preceding-sibling::$ktag) + 1");
    $qry = <<"EOF";

..

/$mv[contains(concat(\@$ml, ','), '$rng')]

/r[$pos]

EOF

    for my $r_node ($type_node->findnodes($qry)) {
        $r_node->removeChildNodes;
        $r_node->appendText($new_value);
    }
}

部分解决:现在可以使用变量

挂起:命名空间问题挂起

my $parser = XML::LibXML->new();

my $document = $parser->load_xml(location => $input_file);

my $xml_root = $document->documentElement();

my $xmlns_root = XML::LibXML::XPathContext->new($xml_root);

$xmlns_root->registerNs('mynamespace', 'mynamespace');

foreach my $type_node ($xmlns_root->findnodes('/mynamespace:root/mynamespace:measInfo[mynamespace:measType/text()="CPUUSAGE"]/mynamespace:measValue[@measObjLdn="bsNo=18"]/mynamespace:r[1]')) {
     print $type_node->textContent();
}

如果删除上的xmlns属性,它会工作吗?是的:下面是代码:对于我的$type_节点($conn->findnodes(“/${ptag}/${ktag}[.='$whr']”){$pos=$type_节点->findvalue(“count(前面的兄弟节点:$ktag)+1”);$qry=removeChildNodes;$r_节点->appendText($new_value);},所以现在有两个问题。1> 如何使用Namespace和2>解决此问题如何使用精确匹配而不是contains()否我能够解决第二个问题:/${vtag}[\@$atag='$rng']它不使用任何它应该使用的变量感谢Bob的响应。但对我来说,使用硬编码的名称空间似乎不太实际。在我的项目中,名称空间并不总是预先知道的。而且它没有解决我的变量问题我的变量问题现在都解决了。唯一的问题是名称空间。我像上面那样试过,但没有解决。关于名称空间中有帖子,但仍然没有解析。您还没有解释为什么“需要”名称空间。很可能,你没有。如果删除了使用名称空间的代码,那么只需将XML作为字符串进行预处理,以删除讨厌的名称空间属性,就完成了。
my $parser = XML::LibXML->new();

my $document = $parser->load_xml(location => $input_file);

my $xml_root = $document->documentElement();

my $xmlns_root = XML::LibXML::XPathContext->new($xml_root);

$xmlns_root->registerNs('mynamespace', 'mynamespace');

foreach my $type_node ($xmlns_root->findnodes('/mynamespace:root/mynamespace:measInfo[mynamespace:measType/text()="CPUUSAGE"]/mynamespace:measValue[@measObjLdn="bsNo=18"]/mynamespace:r[1]')) {
     print $type_node->textContent();
}
for my $type_node ($conn->findnodes("//${ptag}/${ktag}[.='$whr']")) { 

    $pos = $type_node->findvalue("count(preceding-sibling::$ktag) + 1");

    $qry = "../${vtag}[\@$atag='$rng']/r[$pos]";

    for my $r_node ($type_node->findnodes($qry)) {

        $r_node->removeChildNodes;

        $r_node->appendText($new_value);

    }
}