Given a sample xml file:
<root>
<tag attr="value">Content</tag>
<tag attr="value2">Content</tag>
</root>
how do i replace every tag
with a different tag so i get a different file:
<root>
<tag2 attr2="value"/>
<tag2 attr2="value2"/>
</root>
The documentation [1] seems to use Filters, is there a way to accomplish this with arrows alone?
i am now at the point where i can replace a node like this:
runX $ readDocument [] "in.xml"
>>> processTopDown(
(eelem "tag2" += sattr "attr2" "XXX" )
`when` (isElem >>> hasName "tag") )
>>> writeDocument [] "test.xml"
but i have no idea on how to get the attribute right.
[1] http://www.haskell.org/haskellwiki/HXT#Transform_external_references_into_absolute_reference
Try setElemName
, processAttrl
, and changeAttrName
from 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
This works for me with your sample document.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With