我试图解析看起来像这样的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;在我试图阅读的表格中,我无法知道哪些属性属于哪个集合。
我该如何解决这个问题?
答案 0 :(得分:1)
您必须定义自己的&#34;直接兄弟&#34;的XML轴。因为followingSibling
返回上下文后的每个节点。自Axis
中的Text.XML.Cursor
是Cursor -> [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) ]