2014-09-01 3 views
2

Я пытаюсь узнать мне Haskell, и я хотел бы разобрать некоторые XML-файлы со следующей структурой:Синтаксический XML в Haskell

<properties> 
    <property name="a"> 
    <value>1</value> 
    </property> 
    <property name="b"> 
    <value>2</value> 
    </property> 
</properties> 

Следуя примеру из wiki я могу искать все свойства по

runX (readDocument [ withValidate no] "my.xml" 
      >>> deep (isElem >>> hasName "properties") 

но как я могу извлечь только элемент значения property name="b"?

+3

Если вы начинаете изучать Haskell, то я рекомендую вам начать с чего-то более простого. Я не работал с библиотекой HXT, но я думаю, что он основан на комбинаторе Arrow, который представляет собой немного расширенную концепцию. Я нашел tagoup-библиотеку намного проще. – Sibi

ответ

1

TagSoup действительно сделал вещь для меня. На основании tutorial я нашел

module Main where 
import Text.HTML.TagSoup 

searchXML :: IO() 
searchXML = do 
     rsp <- readFile "test.xml" 
     let tags = parseTags rsp 
     let links = extr "value" [] $ 
        extr "property" [("name","b")] tags 
     let value = fromTagText $ links !! 0 
     putStr value 
     where 
      extr a b c = drop 1 $ takeWhile (~/= TagClose a) $ 
         dropWhile (~/= TagOpen a b) c 

main = searchXML 

, который печатает только значение 2. Но я уверен, что код можно упростить.

3

Если честно, я считаю, что HXT - довольно сложная библиотека для использования. До сих пор я понимаю, что вы преобразовываете документ в другой, используя цепочку стрелок.

Если вы хотите узнать стрелки, вы можете обнаружить, что мое решение обманывает, но для меня это было задание: я просто использовать XPath (cabal install hxt-xpath) и получения выходного документа.

import Text.XML.HXT.Core 
import Text.XML.HXT.XPath.Arrows 

main :: IO() 
main = do 
     runX $ readDocument [] "my.xml" 
      >>> 
      root [] [ selem "values" [getXPathTrees "/properties/property[@name=\"b\"]/value"]] 
      >>> 
      writeDocument [withIndent yes] "out.xml" 
     return() 

получая

<?xml version="1.0" encoding="UTF-8"?> 
<values> 
    <value>2</value> 
</values> 
Смежные вопросы