首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用HXT操作XML

使用HXT操作XML
EN

Stack Overflow用户
提问于 2014-11-05 22:21:58
回答 1查看 355关注 0票数 1

据我所知,与XML重构相比,普通的HXT似乎更适合于XML moreso上的查询。然而,作为HXT模块之一,Data.Tree.NTree.Zippers.TypeDefs似乎有一些机器可以深入文档和进行本地工作,而不是更全局的箭头。然而,我似乎什么也做不了。这是my earlier HXT issue的后续文章--所有的代码都是相同的,除了现在trans正在替换this

以下是我的程序的入口点:

代码语言:javascript
复制
start :: App -> IO [XmlTree]
start (App src dest) = runX $
                         readDocument [
                                    --... some settings ...
                                      ]   
                                      src
                         >>>
                         trans
                         >>> 
                         writeDocument [
                                     --... some settings ...
                                       ]
                                       dest

下面是定义trans的模块:

代码语言:javascript
复制
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

最后,这里是我的输入文件:

代码语言:javascript
复制
<html>
  <head>
    <title>foo</title>
  </head>
  <body>
    <h1>foo</h1>
  </body>
</html>

我的产出是:

代码语言:javascript
复制
<?xml version="1.0" encoding="US-ASCII"?>
<html>
  <head>
    <title>foo</title>
  </head>
  <body>
    <h1>foo</h1>
  </body>
</html>

那么,为什么在输出中找不到"bar“呢?它不应该出现在</html>之后吗?再一次,任何帮助都是很棒的:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-06 00:21:55

你的想法似乎很扎实,我不知道你错在哪里,但我试着用它来生成测试代码:

代码语言:javascript
复制
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通常足以读取字符串和文档。以下几点对我来说是可行的:

代码语言:javascript
复制
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填充。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26768285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档