Как создать сложное XML-дерево с помощью F#?

Я ищу метод в F# построить xml-tree-структурировать из модели домен-класс.

Думаю, у вас есть некоторые классы (типы) с отношениями родитель-ребенок, например:

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 ответ

Решение

Моя проблема была решена. Для всех, кто интересуется кодом... я наконец-то придумала что-н. как это:

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

Если у кого-то есть более функциональный стиль, я буду благодарен за любые комментарии.

Другие вопросы по тегам