我需要对 xml 结构进行过多的模式匹配,所以我声明了一个类型来表示 xml 节点。xml 是一个多树,我需要以某种方式遍历节点。为了使树可枚举,我使用嵌套序列推导。我的 XML 永远不会太大,所以在我的情况下,简单性胜过性能,但是下面的代码对于较大的输入是否有点危险,或者可以保持原样。
type ElementInfo = { Tag : string; Attributes : Map<string, string> }
type Contents =
| Nothing
| String of string
| Elements of Node list
and Node =
| Element of ElementInfo * Contents
| Comment of string
member node.PreOrder =
seq {
match node with
| Element (_, Elements children) as parent -> yield parent; yield! children |> Seq.collect (fun child -> child.PreOrder)
| singleNode -> yield singleNode
}