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标准,这些标准显然不是为了读我的凡人而写的。
答案 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 question。 XML::LibXML
从 libxml2 调用xmlXPathCompile
,确保生成的节点集按文档顺序排序。