2013-09-01 3 views
1

Моя цель состоит в том, чтобы извлечь список из двух списков из этого XML-файла:Синтаксический XML с HXT

<famous_people> 
    <famous_person> 
    <first_name>Wolfgang</first_name> 
    <last_name>Goethe</last_name> 
    <year_of_birth>1749</year_of_birth> 
    <country_of_origin>Germany</country_of_origin> 
    </famous_person> 
    <famous_person> 
    <first_name>Miguel</first_name> 
    <last_name>Cervantes</last_name> 
    <widely_known_for>Don Quixote</widely_known_for> 
    </famous_person> 
</famous_people> 

Список Я заинтересован в добыче является:

[[("first_name","Wolfgang"),("last_name","Goethe"),("year_of_birth","1749"),("country_of_origin","Germany")],[("first_name","Miguel"),("last_name","Cervantes"),("widely_known_for","Don Quixote")]] 

Я только удалось добраться до точки, где все кортежи, которые меня интересуют внутри одного большого плоского списка, о чем свидетельствует этот выход GHCi:

Prelude> import Text.XML.HXT.Core 
Prelude Text.XML.HXT.Core> import Text.HandsomeSoup 
Prelude Text.XML.HXT.Core Text.HandsomeSoup> 
Prelude Text.XML.HXT.Core Text.HandsomeSoup> html <- readFile "test.html" 
Prelude Text.XML.HXT.Core Text.HandsomeSoup> 
Prelude Text.XML.HXT.Core Text.HandsomeSoup> let doc = readString [] html 
Prelude Text.XML.HXT.Core Text.HandsomeSoup> 
Prelude Text.XML.HXT.Core Text.HandsomeSoup> runX $ doc >>> getChildren >>> getChildren >>> getChildren >>> multi (getName &&& deep getText) 
[("first_name","Wolfgang"),("last_name","Goethe"),("year_of_birth","1749"),("country_of_origin","Germany"),("first_name","Miguel"),("last_name","Cervantes"),("widely_known_for","Don Quixote")] 

Как получить желаемый список из двух списков?

ответ

2

Я использовал функцию listA, чтобы получить результат в списке. Вот мой код:

module Famous where 
import Text.XML.HXT.Core (isElem, hasName, getChildren, getText, listA, runX, readDocument, getName) 
import Control.Arrow.ArrowTree (deep) 
import Control.Arrow ((>>>), (&&&)) 
import Text.XML.HXT.Arrow.XmlArrow (ArrowXml) 
import Text.XML.HXT.DOM.TypeDefs (XmlTree) 

atTag :: ArrowXml a => String -> a XmlTree XmlTree 
atTag tag = deep (isElem >>> hasName tag) 

parseFamous :: ArrowXml a => a XmlTree [(String, String)] 
parseFamous = atTag "famous_person" >>> listA (getChildren >>> 
               (getName &&& (getChildren >>> getText))) 



main :: IO() 
main = do 
    let path = "famous.xml" 
    result <- runX (readDocument [] path >>> parseFamous) 
    print result 
Смежные вопросы