Как создать сложное 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
Если у кого-то есть более функциональный стиль, я буду благодарен за любые комментарии.