0

だから私はこのXMLファイルを解析しています。内部のノードに到達すると、コード用に1つの子、記述用に1つ、外部ノード参照を保持する1つ以上の(孫)ノードがあります。

最初に単純な矢印表記と<+>集計を試して、必要なすべての情報を取得しましたが、それは大きなリストを表示するだけで、これを実現するためのよりエレガントな方法があるのではないかと思いました。

そこで、代わりに矢印表記を試して、コードを線に沿って見せるようにしました。

import Text.XML.HXT.Core

getDocument cale = readDocument [withValidate  no] cale

atName name=deep (hasName name)
text = getChildren>>>getText

getList = deep (hasName "list-info")>>>
 proc x -> do
    desc <- text <<< atName "desc"  -< x
    code <- text  <<< atName "code"   -< x
    refs <- getAttrValue "idref" <<< deep (hasName "service-id-ref") -< x
    returnA -< (desc,code,refs)

基本的にdeepは、このフィルターについて理解している限り、同じレベルのすべての「service-id-ref」ノードを返すことになっていますが、「list-info」名を満たす最初のノードには2つの「service-id-ref」子があります2つの異なる孫ノードとrefのノードは、毎回最初のノードにのみバインドされます。つまり、基本的には(String、String、[String])の3タプルを期待していましたが、取得したのは3つの通常の文字列だけです。

do-notation(または一般的に)の矢印についての私の理解が不十分なためですか、それとも他の方法でrefをバインドしようとする必要がありますか?

前もって感謝します

4

1 に答える 1

1

あなたのxmlファイルを持っていないので、私の答えが正しいかどうかを確認するのは難しい. しかし、期待される結果に基づいて、参照の文字列のリストが必要です。

リストを取得する矢印には、関数 listA があります。

したがって、コードは次のように変更される可能性があります(テストされていません):

refs <- listA (getAttrValue "idref" <<< deep (hasName "service-id-ref")) -< x

http://www.haskell.org/haskellwiki/HXT/Practical/Simple2から例を読みましたか?

コード getTeams3 を参考にしてください。

于 2012-02-08T20:56:36.587 に答える