不确定如何使用 Text.XML.Cursor 解析它

Not sure how to parse this using Text.XML.Cursor

我正在尝试解析如下所示的 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,甚至是那些不 "belong" 到 table 的我正在尝试读取,但我无法知道哪些属性属于哪个集合。

我该如何解决这个问题?

您必须将 "immediate sibling" 的 XML 轴定义为 followingSibling returns 上下文之后的每个节点。这是可能的,因为 Text.XML.Cursor 中的 AxisCursor -> [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) ]