“查找”按顺序返回节点吗?

时间:2014-05-28 12:09:31

标签: xml perl dom xpath libxml2

XML::LibXML::Node::find和相关方法保证节点列表将始终按照XML文档中的顺序进行排序吗?

这对我来说非常重要,因为我的文档对应于一个大型数组,在这个数组中我希望能够在某些情况下删除一系列项目,并且我必须确保这样的内容能够保持一致:

my @nodes = $dom->find('//MyElement[@attr=something]/descendant::Token/@id')
                ->get_nodelist;
for my $token ( reverse map { $_->value } @nodes ) {
    splice @my_big_array, $token, 1;
}

困难在于XML::LibXML中没有记录这一点,我不知道这是否取决于libxml2实施,whose documentation我真的不了解,或者DOM standard或其他一些W3C标准,这些标准显然不是为了读我的凡人而写的。

2 个答案:

答案 0 :(得分:2)

据我所知,当前的XML标准确实关心节点的顺序,XML :: LibXML的当前实现每次都会给你相同的顺序。

了解详情:In XML, is order important?Does XML care about the order of elements?

好好阅读:http://www.ibm.com/developerworks/xml/library/x-eleord/index.html

1:它需要以某种方式排序,因此同一个解析器的每次运行都应该返回相同的结果。 99%的解析器使用xml文件中的顺序,其余的按照模式中的顺序排序

  

XML信息集(InfoSet - 请参阅参考资料),核心XML数据   由W3C定义的模型,将元素子元素表征为:An   按文件顺序排列的儿童信息项目清单。

2:可以强制执行或删除排序

  

兄弟元素子图案之间的&符号(&)   表明任何订单都是可以接受的。

element memo {
  element title { text } &
  element date { text } &
  element from { text } &
  element to { text } &
  element body { text }
}

答案 1 :(得分:1)

我基本上是answered this in a related questionXML::LibXML libxml2 调用xmlXPathCompile,确保生成的节点集按文档顺序排序。