为什么HXT的xpath搜索器不返回简单查询的结果?

时间:2014-07-01 00:44:02

标签: haskell xpath hxt

http://www.xpathtester.com/xpath我测试了//我应该工作。为什么不呢?

import Text.XML.HXT.Core
import Text.XML.HXT.XPath
import System.Environment
runX $ readString [] "<r><i/></r>" >>> getXPathTrees "/" >>> writeDocumentToString []
-- ["<r><i/></r>"]
runX $ readString [] "<r><i/></r>" >>> getXPathTrees "//i" >>> writeDocumentToString [] 
-- [""]

3 个答案:

答案 0 :(得分:1)

不知何故,我认为您正在获取匹配节点的文本内容。我不太清楚为什么会这样。以下是我所看到的导致我得出这个结论的内容:

runX $ readString [] "<r><i>test</i></r>" >>> getXPathTrees "//i" >>> writeDocumentToString []
-- ["test"]

The documentation说:&#34; XmlTrees以外的XPath值(数字,属性,标记名,...)是convertet [sic]到文本节点。&#34;并且我不确定如何编写返回XmlTrees值的XPath表达式,除非它用于XPath节点集。这似乎并非如此,因为属性是一个XPath节点,因此它可以在一个节点集中,并且文档的措辞意味着属性不能与该类型一起返回。

HTH

答案 1 :(得分:1)

XPath表达式的评估是错误的。 例如,这些查询

runX $ readString [] "<r><i/></r>" >>> getXPathTrees "/*[1]" >>> writeDocumentToString [] 
runX $ readString [] "<r><i/></r>" >>> getXPathTrees "/r" >>> writeDocumentToString []

应该返回&#34; r&#34; element(XML文档的根元素),但返回

["<i/>"]

似乎getXPathTrees返回匹配表达式的内容,因此您必须返回节点的父节点:

runX $ readString [] "<r><i/></r>" >>> getXPathTrees "/r/i/.." >>> writeDocumentToString []
["<i/>"]

runX $ readString [] "<r><i id='1'/><i id='2'/></r>" >>> getXPathTrees "//i/.." >>> writeDocumentToString []
["<i id=\"1\"/><i id=\"2\"/>"]

(我不使用HXT,这是错误的,我想知道是否有另一种干净的方式来获取节点而不跳转到父节点...)

答案 2 :(得分:0)

如果有人仍在寻找一种使用HXT获取text()节点内容的方法,则下面的要点显示了另一种方法:

https://gist.github.com/jbpotonnier/1901205

从以上要点简化而成:

runX $ readDocument [] src
            >>>
            root [] [getXPathTrees "/some/path"]
            >>>
            writeDocument [] dst

基本上,在写入字符串之前,它将文本节点包装在另一个节点中。