2012-02-08 16 views
0

私はこのXMLファイルを解析しています。一度私はそれの中のノードに到達すると、私はコードのために1つの子供、descritionのための1つと、ノード参照外の1つ以上の(孫)ノードを保有しています。HXT XML検索で期待した結果が返されない

私が最初に私が望んでいたすべての情報を取得するには、単純な矢印表記と< +>集計を試みたが、それだけで大きなリストをポップし、私はおそらくこの

だから私が試した矢印を達成するために、よりエレガントな方法があったと思いました代わりの表記を行うと、線に沿ってコードを見て何かを作る:私の理解は、このフィルタが、で行く限り同じレベルにあるすべての「サービス-ID-REF」ノードを返すことになっている

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) 

基本的には深いです"list-info"の名前を満たす最初のノードには、2つの異なるgrand-grand chiに2つの "service-id-ref"子ノードがありますldrenノードとrefは、毎回最初のものにのみバインドされます。だから基本的に私は(String、String、[String])の3タプルを期待していたが、私は3つの通常のStringsを持っていた。

私はdo not-notation(または一般的に)の矢の私の貧弱な理解のためにですか?または私は別の方法でrefsをバインドしようとする必要がありますか?それは私の答えが正しいかどうかを確認することは困難ですので、事前

答えて

1

おかげで私はあなたのxmlファイルを持っていません。しかし、期待される結果に基づいて、あなたは参照のための文字列のリストが必要です。

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

だからあなたのコードは次のようなもの(未テスト)に変更することができる:http://www.haskell.org/haskellwiki/HXT/Practical/Simple2

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

はあなたからの例を読むことがありますか?

インスピレーションのためのコードgetTeams3を見てください。

+0

ありがとう、それは....私は矢印を見つめるより多くの時間を費やす必要があります –

関連する問題