如何使用F#创建复杂的XML树?

时间:2014-04-30 09:18:25

标签: xml data-structures f# linq-to-xml xml-generation

我正在F#中搜索一个方法来构建一个来自域类模型的xml-tree - structrue。

猜猜你有一些具有父子关系的类(类型),如:

Container
-> Child
-> Child
-> Container
   -> Child
   -> Container
      -> Child
      -> Child
   -> Container
   -> etc.

问题是不能只是简单地将此domain-tree 1:1 翻译成XML,但有时您需要做一些修改,例如:

 "If Type(Element) = A then add additionally XYZ-Element at root"
 "If Type(Element) = B then nest B into ABC-Element"

目前我正在使用XDocument + System.Xml.Linq以及一些针对我的域类模型的递归函数,该函数获取对必须从另一个函数初始化的第一个XElement的引用。 整个“引用的东西”似乎相当不起作用,我多次用C#而不是F#来实现它。

有人可以提出更实用,更自然的F#ish方法来解决这样的任务吗?

1 个答案:

答案 0 :(得分:0)

我的问题已经解决了。对于所有对代码感兴趣的人...... 我终于想到了......像这样:

open System.Xml
open System.Xml.Linq

let xmlNs           = "somenamespaceurl"
let XNameStd   name = XName.Get(name, xmlNs)

let InsertIfCondition valueToInsert valueToCheck attributeName (element:XElement) =
  if valueToInsert = valueToCheck then
    element.Add(XAttribute(XNameStd attributeName,valueToInsert))


let InsertSthToTree(sth:DomainObject) (currentRoot:XElement) =
  let element = XElement(XNameStd "MyDomainElementInXML")
  currentRoot.Add(element)
  InsertIfCondition(sth.BooleanProperty,true,"IsEnabled",element)

let CreateXMLDoc =
  let someObj = DomainObject(...)
  let doc     = XDocument()
  InsertSthToTree(doc.Root)
  doc

如果某人有更多功能性的做法,我将不胜感激。