据我所知,与XML重构相比,普通的HXT似乎更适合于XML moreso上的查询。然而,作为HXT模块之一,Data.Tree.NTree.Zippers.TypeDefs似乎有一些机器可以深入文档和进行本地工作,而不是更全局的箭头。然而,我似乎什么也做不了。这是my earlier HXT issue的后续文章--所有的代码都是相同的,除了现在trans正在替换this。
以下是我的程序的入口点:
start :: App -> IO [XmlTree]
start (App src dest) = runX $
readDocument [
--... some settings ...
]
src
>>>
trans
>>>
writeDocument [
--... some settings ...
]
dest下面是定义trans的模块:
module Main.Internal where
import Data.Maybe (fromJust)
import Text.XML.HXT.DOM.XmlNode (mkText')
import Text.XML.HXT.Core hiding (addToTheRight)
import Data.Tree.NTree.Zipper.TypeDefs
trans :: IOSLA (XIOState s) XmlTree XmlTree
trans = arrL go
where
go :: XmlTree -> [XmlTree]
go x = [fromNTZipper . manip . toNTZipper $ x]
unList :: [a] -> a
unList [] = error "dun goofed!"
unList (x:_) = x
manip = fromJust . (addToTheRight $ mkText' "bar")
. fromJust . down最后,这里是我的输入文件:
<html>
<head>
<title>foo</title>
</head>
<body>
<h1>foo</h1>
</body>
</html>我的产出是:
<?xml version="1.0" encoding="US-ASCII"?>
<html>
<head>
<title>foo</title>
</head>
<body>
<h1>foo</h1>
</body>
</html>那么,为什么在输出中找不到"bar“呢?它不应该出现在</html>之后吗?再一次,任何帮助都是很棒的:)
发布于 2014-11-06 00:21:55
你的想法似乎很扎实,我不知道你错在哪里,但我试着用它来生成测试代码:
import Data.Tree.NTree.Zipper.TypeDefs
import Text.XML.HXT.Parser.HtmlParsec
import Text.XML.HXT.DOM.XmlNode
import Text.XML.HXT.DOM.TypeDefs
import Data.Tree.NTree.TypeDefs
import Control.Arrow.IOListArrow
import Text.XML.HXT.Arrow.WriteDocument
str = "<html>\n <head>\n <title>foo</title>\n </head>\n <body>\n <h1>foo</h1>\n </body>\n</html>"
fromJust (Just x) = x
manip :: NTree XNode -> NTree XNode
manip x = fromNTZipper $ fromJust $
down (toNTZipper x) >>= addToTheLeft (mkText "Boo!") >>= up
stringify = runIOLA $ writeDocumentToString []
main = do
xs <- mapM stringify $ map manip $ parseHtmlDocument "" str
putStrLn (show xs)输出[["\n Boo!<head>\n <title>foo</title>\n </head>\n <body>\n <h1>foo</h1>\n </body>\n"]]。我不确定<html>元素到底发生了什么,但是addToTheLeft确实按照它说的做了。(我正在使用>>=作为上面的单曲)。
我不知道上面是trans还是>>>,但是您正在做的manip看起来应该能工作。
编辑:请注意,我在上面所写的很多内容都避免了对HXT至关重要的惯用箭头,这可能就是我得到一些奇怪结果的原因。从包结构来看,导入Text.XML.HXT.Core通常足以读取字符串和文档。以下几点对我来说是可行的:
Prelude> let file = "<html>\n <head>\n <title>foo</title>\n </head>\n <body>\n <h1>foo</h1>\n </body>\n</html>"
Prelude> :m +Text.XML.HXT.Core
Prelude Text.XML.HXT.Core> let apply (arrows) str = head $ runLA (xshow $ hread >>> arrows) str
Prelude Text.XML.HXT.Core> :t apply
apply :: LA XmlTree XmlTree -> String -> String
Prelude Text.XML.HXT.Core> putStrLn $ apply (withNav $ moveDown >>> addToTheLeft (txt "bar") >>> moveUp) file
<html>bar
<head>
<title>foo</title>
</head>
<body>
<h1>foo</h1>
</body>
</html>这些都是相关的功能。注意,HXT似乎已经通过在( Maybe列表箭头的)列表中破坏不满足给定谓词的LA树来完成它的XML填充。
https://stackoverflow.com/questions/26768285
复制相似问题