【问题标题】:Does "find" return nodes in order?“查找”是否按顺序返回节点?
【发布时间】:2014-05-28 12:09:31
【问题描述】:

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 标准,显然不是为了让我凡人阅读而编写的。

【问题讨论】:

  • 简短回答:是的。这几乎是如此明显的要求,这是不言而喻的。但是鉴于 XPath 是有序的,任何实现 XPath 的模块也必须遵循该要求。所以是的XML::TwigXML::LibXML。并且出于不同的原因,但即使是XML::Simple

标签: xml perl dom xpath libxml2


【解决方案1】:

据我所知,当前的 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 定义的模型,将元素子元素描述为: 子信息项的有序列表,按文档顺序排列。

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

兄弟元素子模式之间的 & 字符 表明任何订单都是可以接受的。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-10-20
      • 2012-06-11
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多