2

http://www.xpathtester.com/xpathで //i が動作することをテストしました。なぜそうしないのですか?

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

ドキュメントには、「XmlTree 以外の XPath 値 (数値、属性、タグ名など) は、テキスト ノードに変換されます」と記載されています。XmlTreesXPathノードセットに使用されない限り、値を返すXPath式を記述する方法がわかりません。属性はXPathノードであるため、ノードセットに含まれる可能性があり、ドキュメントの表現方法は、そのタイプで属性を返すことができないことを意味するため、そうではないようです。

HTH

于 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 に答える