2

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

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 [] 
-- [""]
4

3 回答 3

1

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

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

应该返回“r”元素(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,这个太不对了,不知道有没有其他干净的方法可以不用跳转到父节点就可以得到节点……)

于 2014-07-03T06:27:18.003 回答
1

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

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

文档说:“XmlTrees 以外的 XPath 值(数字、属性、标记名……)被转换为文本节点。” 而且我不确定如何编写返回XmlTrees值的 XPath 表达式,除非它用于 XPath 节点集。情况似乎并非如此,因为一个属性是一个 XPath 节点,所以它可能在一个节点集中,并且文档的措辞方式意味着不能使用该类型返回属性。

高温高压

于 2014-07-01T23:05:47.943 回答
0

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

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

从上面的要点简化:

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

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

于 2020-06-08T13:46:11.963 回答