这个问题是关于如何使用xmlns
属性等解析 xml 内容。我编写了代码来解析它的工作原理。我会很感激关于它是否可以做得更好的指针。
我有一个test.xml
如下的 XML 文件:
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body>
<SomeResponse xmlns="https://testsomestuff.org/API/WS/">
<SomeResult>
<html>
<head>
<title>My <b>Title</b></title>
</head>
<body>
<p>Foo bar baz</p>
</body>
</html>
</SomeResult>
</SomeResponse>
</soap:Body></soap:Envelope>
我使用以下代码编写了解析“SomeResult”内容的代码xml-conduit
:
{-# LANGUAGE OverloadedStrings #-}
import Prelude hiding (readFile)
import Text.XML
import Text.XML.Cursor
import qualified Data.Text as T
import Data.Text.Lazy.Builder (toLazyText)
import Data.Text.Lazy (fromStrict)
main :: IO ()
main = do
doc <- readFile def "test.xml"
let cursor = fromDocument doc
res = fromStrict $ T.concat $ child cursor >>= laxElement "Body" >>= child >>= laxElement "SomeResponse" >>= child >>= laxElement "SomeResult" >>= descendant >>= content
pres = parseText_ def res
cursor2 = fromDocument pres
res2 = child cursor2 >>= element "head" >>= child >>= element "title" >>= descendant >>= content
print $ res2
中的输出ghci
:正确解析:
*Main> main
["My ","Title"]
laxElement
定位内容的方法是SomeResult
好方法吗?如果有更好的方法,我将非常感谢这方面的指点。
此外,我需要反向进行 http 编码(在构建上述响应的请求时),其中内部主体被转义(如SomeResult
in下text.xml
)。这是在使用构建请求时默认处理的事情Text.XML
,还是我必须使用html-entities 之类的东西将内部主体显式转换为转义的 http ?