2014-04-30 5 views
2

F#에서 도메인 클래스 모델에서 xml-tree -structrue을 생성하는 방법을 찾고 있습니다. 당신이 단지이 domain-tree1 번역하지 수 있다는 것입니다F #을 사용하여 복잡한 XML 트리를 만드는 방법은 무엇입니까?

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

것은 :

는 같은 부모 - 아동 관계와 몇 가지 클래스 (유형)를 가지고 추측 XML로 1
을하지만, 가끔해야 할 약간의 수정은 예 : 나는 XDocument + System.Xml.Linq 일부 재귀 함수를 사용하고

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

내 도메인 클래스 모델을 통해 다른 함수에서 초기화해야하는 첫 번째 XElement에 대한 참조를 얻습니다. 전체 "참조 사항"은 상당히 기능적으로 보이지 않으며 F #보다는 C#으로 구현하기를 여러 번 부탁했습니다.

누군가가 더 많은 기능과 자연스러운 제안을 할 수 있습니까? F#ish 그런 작업을 해결할 방법이 있습니까?

+1

xml 유형 공급자가 더 잘 작동 할 수 있습니다. https://fsharp.github.io/FSharp.Data/library/XmlProvider.html –

+1

XmlProvider를 살펴 보았습니다. 그러나 데이터 공급자를 실행시키기 위해 일부 샘플 데이터를 제공해야하기 때문에 실제로는 내 작업에 적합하지 않습니다. 그리고 샘플 데이터를 기반으로 XML을 작성할 수있었습니다. 괜찮을 것 같은 단순한 구조체의 경우에는 관계가 너무 복잡해서 항상 샘플 데이터를 제공 할 수 없다고 생각합니다. –

+0

직렬화 할 객체 계층 구조와 예상되는 XML을 표시 할 수 있습니까? – Daniel

답변

0

내 문제가 해결되었습니다. 코드에 관심이있는 모든 사람들을 위해 ... 나는 마침내 sth를 생각해 냈습니다. 다음과 같이하십시오 :

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 

누군가가이 작업을 수행하는 기능적인 스타일을 가지고 있다면 나는 모든 의견을 환영 할 것입니다.