【发布时间】:2017-04-12 14:08:35
【问题描述】:
我正在使用 SimpleXML / XPath 编写一个 PHP 脚本,该脚本需要打印 XML 文件中句子的引用,该文件的结构类似于以下内容:
<text name="text_title">
<book name="book_title">
<chapter name="chapter_title">
<sentence name="sentence_number" id="0000">
<word attr="desired_val" id="1111" />
<word attr="undesired_val" id="2222" />
</sentence>
</chapter>
</book>
</text>
问题是我需要返回包含带有 attr="desired_val" 的单词的每个句子,然后是包含其文本、书籍、章节和句子编号的引文。我目前正在使用 xpath 查询进行第一部分
//word[@$attr='desired_val']/ancestor::sentence
第二部分基于每个返回句子的 ID 属性进行一系列后续 xpath 查询,例如对于文本节点:
/text/[book/chapter/sentence[@id={$id}]]/@name
(等等,对于其他相关节点)。我的问题是,如果有大量记录,这会变得非常低效,并导致脚本超时,结果超过十个。任何人都可以提出有关更好方法的想法吗?
【问题讨论】:
-
你能分享想要的输出吗?你究竟想如何简化你的表达?你想摆脱
book/chapter/sentence还是什么? -
我猜每个文本匹配的单词数量相当大。这导致文本元素的冗余结果。您真的对冗余结果列表感兴趣吗?如果不是,则在该文本元素中的第一个单词匹配之后停止在该文本元素中的搜索就足够了。
-
/text/[book/chapter/sentence[word[@id={$id}]]]/@name -
我应该指定一旦返回句子祖先,它的id值就绑定到$id。我将立即进行编辑以表示这一点,但第二个 XPath 查询对于我想要它执行的操作是正确的。 @ceving 关于大量匹配是正确的——不幸的是,这就是野兽的本性。我确实需要得到所有这些,而不是单身。例如,使用上面给出的结构,所需的输出或多或少类似于“1111 2222: text_title, Book book_title, Chapter chapter_title, sentence sentence_number”
-
对于给定的节点来说,返回那个节点的每个祖先的“name”属性的值(假设它存在)似乎比它更容易,这是问题的根源。