我正在使用XML::LibXML,我只需要计算XPath表达式指定的节点数.
使用下面前两个代码行中的任何一个产生我正在寻找的东西.我可以使用或不使用countXPath函数(是的,我知道,因为它返回一个列表).findvaluefindfindnodes
my $node_cnt = $dom->findvalue("count($xpath_str)"); # WORKS!
my $node_cnt = $dom->find("count($xpath_str)"); # WORKS!
my @node_cnt = $dom->findnodes("count($xpath_str)"); # count doesn't work!
Run Code Online (Sandbox Code Playgroud)
这引出了一个普遍的唠叨问题:这三种find类型有什么区别?在文档中,它说:
$string = $node->findvalue($xpath)
$result = $node->find($xpath)
@nodes = $node->findnodes($xpath_expression)
Run Code Online (Sandbox Code Playgroud)
论证$xpath_expression与$xpath文档之间是否真的存在差异?
对于返回标量的两个人来说,有什么区别?
我试图理解使用一种查找类型的重要性 - 谢谢!
对于我的生活,我无法找到正确的代码来访问我的XML文件中的注释行.难道我用findnodes,find,getElementByTagName(怀疑).
我是否正确地假设这些评论行是可访问的?我希望如此,因为我知道我可以添加评论.
注释节点的类型编号为8,因此它们必须是可解析的.
最终,我想要做的就是删除它们.
my @nodes = $dom->findnodes("//*");
foreach my $node (@nodes) {
print $node->nodeType, "\n";
}
<TT>
<A>xyz</A>
<!-- my comment -->
</TT>
Run Code Online (Sandbox Code Playgroud) 简单的removeChild测试,虽然删除了xml行,但它保持一个空的空行,怎么来的?顺便说一句 - 我的源xml文件确实有缩进,但即使我删除它们我得到相同的结果.那么,如果仍然保留一个空格,那么删除子行的意义何在?
有没有办法在将结果xml行输出到文件之前重新格式化?
foreach my $XYZ ($doc->findnodes("//EE1"))
{
my $library = $XYZ->parentNode;
$library->removeChild($XYZ);
}
print {$FH} $doc->toString(0);
RESULT IN OUTPUT FILE:
<?xml version="1.0"?>
<TopTag>
<AA1>ZNY</AA1>
<AA2>111</AA2>
<BB1>
<CC1>ZNY</CC1>
<CC2>
<DD1>
<-----blank line remains
<EE2>2000</EE2>
</DD1>
<DD1>
<-----blank line remains
<EE2>5000</EE2>
</DD1>
</CC2>
</BB1>
<AA1>ZNY2</AA1>
<AA2>2</AA2>
</TopTag>
Run Code Online (Sandbox Code Playgroud) 我有一个HoH数据结构.外层哈希的键是数字的 - 所以我想转储由第一个哈希键数字排序的HoH(不关心内部哈希的顺序).我一直在尝试不同的Sortkeys潜艇......
use Data::Dumper;
#$Data::Dumper::Sortkeys = sub { [sort { $a <=> $b } (keys %{$_[0]})] }; ## A
$Data::Dumper::Sortkeys = sub { [sort { $a <=> $b } keys %$_ ] }; ## B
print Dumper(\%dsCmdBlocks);
Run Code Online (Sandbox Code Playgroud)
我似乎无法在Sortkeys子例程中找到正确的语法,它将以数字方式转储由第一个键排序的HoH.当我尝试"A"时,它对第一个键进行排序很好,但它也吐出错误消息,说内部参数不是数字(这是由于使用了[0].所以"A"不是这是正确的方法.但我似乎无法在我的生活中弄清楚如何仅对第一个哈希进行排序.顺便说一下 - 当我通过一个正常的foreach循环发送HoH时:
foreach my $sk (sort {$a<=>$b} keys %dsCmdBlocks)
{
print "KEY: $sk\n";
}
Run Code Online (Sandbox Code Playgroud)
它按预期工作.
那么如何将我的Sortkeys子设置为仅对第一个哈希键进行排序?
我正在使用XML :: LibXML,我想添加一个注释,使得注释不在标记之内.甚至可以把它放在标签之外?我试过appendChild,insertBefore | 之后,没有区别......
<JJ>junk</JJ> <!--My comment Here!-->
# Code excerpt from within a foreach loop:
my $elem = $dom->createElement("JJ");
my $txt_node = $dom->createTextNode("junk");
my $cmt = $dom->createComment("My comment Here!");
$elem->appendChild($txt_node);
$b->appendChild($elem);
$b->appendChild($frag);
$elem->appendChild($cmt);
# but it puts the comment between the tags ...
<JJ>junk<!--My comment Here!--></JJ>
Run Code Online (Sandbox Code Playgroud)