不知道如何使用Text.XML.Cursor解析它

时间:2016-03-07 22:55:41

标签: haskell conduit xml-conduit

我试图解析看起来像这样的XML:

<h1>Collection A</h2>
<table>
  <tr>Property 1</tr>
  <tr>Property 2</tr>
</table>

<h2>Collection 2</h2>
<table>
  <tr>Property 1</tr>
  <tr>Property 88</tr>
</table>

我想解析这些信息:

MyClass "Collection 1" "Property 1"
MyClass "Collection 1" "Property 2"
MyClass "Collection 2" "Property 1"
MyClass "Collection 2" "Property 88"

我不确定该怎么做。我的第一个想法是做element "h1" $| followingSibling &// element "tr" &/ content这样的事情,但这不起作用,因为它会捕获所有的tr,甚至是那些不属于&#34的人#&#t} 34;在我试图阅读的表格中,我无法知道哪些属性属于哪个集合。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您必须定义自己的&#34;直接兄弟&#34;的XML轴。因为followingSibling返回上下文后的每个节点。自Axis中的Text.XML.CursorCursor -> [Cursor]的类型同义词后,可能会发生这种情况:

immediateSibling = take 1 . (anyElement <=< followingSibling)

组合来自不同级别的信息只是嵌套列表理解:

selected = root $/ selector
selector = element "h2" >=> toTuple

-- replace tuple with your constructor
toTuple c = [ (coll, prop)
            | coll <- c $/ content
            , prop <- c $| (immediateSibling >=> element "table" &/ element "tr" &/ content) ]