在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 []
-- [""]
答案 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
基本上,在写入字符串之前,它将文本节点包装在另一个节点中。