HXT XML-поиск не возвращает ожидаемых результатов - PullRequest
0 голосов
/ 08 февраля 2012

Так что я анализирую этот файл XML.Как только я достигаю узла внутри него, у меня появляется один дочерний элемент для кода, один для описания и один или несколько (внуков) узлов, хранящих внешние ссылки на узлы.

Сначала я попытался использовать простую систему обозначений стрелок и <+> агрегирование дляполучить всю информацию, которую я хотел, но это просто выскочило в большой список, и я подумал, что, возможно, был более элегантный способ добиться этого

Так что я попытался вместо этого сделать обозначение стрелки и заставить код выглядеть примерно так:

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)

В основном глубокий должен возвращать все узлы "service-id-ref" на одном уровне, насколько мне известно об этом фильтре, но первый узел, удовлетворяющий имени "list-info", имеет 2Дочерние узлы "service-id-ref" на 2 разных дочерних узлах grand-grand и refs связаны только с первым каждый раз.В общем, я ожидал три кортежа (String, String, [String]), но все, что я получил, это 3 нормальные строки.

Это из-за моего плохого понимания стрелок в нотации (или вообще) или я должен попытаться привязать ссылки другим способом?

Заранее спасибо

1 Ответ

1 голос
/ 09 февраля 2012

У меня нет вашего xml-файла, поэтому сложно проверить, правильный ли мой ответ. Но исходя из ожидаемого результата, вы хотите список строк для ссылок.

В Arrow для получения списка есть функция listA.

Таким образом, ваш код может быть изменен на что-то вроде этого (не проверено):

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

Вы читали примеры из: http://www.haskell.org/haskellwiki/HXT/Practical/Simple2?

Посмотрите на код getTeams3 для вдохновения.

...