Как заменить узлы в HXT? - PullRequest
       39

Как заменить узлы в HXT?

7 голосов
/ 28 февраля 2012

Для примера XML-файла:

<root>
  <tag attr="value">Content</tag>
  <tag attr="value2">Content</tag>
</root>

как заменить каждый tag другим тегом, чтобы я получил другой файл:

<root>
  <tag2 attr2="value"/>
  <tag2 attr2="value2"/>
</root>

Документация [1], кажется, использует Фильтры, есть ли способ сделать это только с помощью стрелок?


Обновление

Сейчас я нахожусь в точке, где я могу заменить узел следующим образом:

runX $ readDocument [] "in.xml" 
       >>> processTopDown( 
               (eelem "tag2" += sattr "attr2" "XXX" ) 
               `when` (isElem >>> hasName "tag") ) 
       >>> writeDocument [] "test.xml"

но я понятия не имею, как правильно получить атрибут.


[1] http://www.haskell.org/haskellwiki/HXT#Transform_external_references_into_absolute_reference

1 Ответ

2 голосов
/ 29 февраля 2012

Попробуйте setElemName, processAttrl и changeAttrName из Text.XML.HXT.XmlArrow:

runX $ readDocument [] "in.xml" >>> transform >>> writeDocument [] "test.xml"
  where
    transform = processTopDown $
      ( setElemName (mkName "tag2") >>>
        processAttrl (changeAttrName $ mkName . attrMap . localPart)
      ) `when` (isElem >>> hasName "tag")
    attrMap "attr" = "attr2"
    attrMap a = a

Это работает для меня с вашим образцом документа.

...