正如我们从我之前的问题中了解到的,
+=
是允许一次添加一个元素的运算符。是否可以“检测”先前添加的元素并控制未来添加的方式?
这是一个开始我们调查的简单程序:
module Main (main) where
import Control.Monad (void)
import Text.XML.HXT.Core
main :: IO ()
main = void $ runX $ root [] [foo]
>>> writeDocument [withIndent yes] "test.xml"
foo :: ArrowXml a => a XmlTree XmlTree
foo = eelem "foo" += bar += bar += bar -- += is left associative
bar :: ArrowXml a => a XmlTree XmlTree
bar = ifA (deep (hasName "bar")) (eelem "baz") (eelem "bar")
在这里,foo
创建 'foo' 节点及其内容。内容是用
bar
箭头生成的,它应该足够聪明,可以检测到之前添加的“bar”元素,并改变它的行为。在这里我们deep
为了简单起见:如果 'bar' 元素是 'foo' 元素的子元素,无论它有多深,都应该检测到它(getChildren >>> hasName "bar"
也应该这样做)。
因此,文件的预期内容test.xml
是:
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar/>
<baz/>
<baz/>
</foo>
当然,它不起作用。这是我得到的:
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar/>
<bar/>
<bar/>
</foo>
我的问题:
bar
为什么箭头无法检测到“bar”元素?如何检测它?