從XML

2011-06-06 57 views
0

創建樹我想在C#創建一個XML下面的樹結構:從XML

Root 
-->A 
--->1 
--->2 
-->B 
--->1 
--->2 

XML配置將是這樣的:

<root> 
    <parent1 name="A"> 
     <child name=1> 
     <child name=2> 
    </parent1> 
    <parent2 name="B"> 
     <child name=1> 
     <child name=2> 
    </parent2> 
</root> 

任何指引?

+2

好吧,考慮到一個XML文檔*是一棵樹,爲什麼不用'XmlDocument'加載它呢? – 2011-06-06 07:09:33

回答

2
var doc = System.XML.Linq.XElement.Parse(xmlString); 

一個XDocument 一棵樹。

+0

我在找Linq的東西 – Sara 2011-06-06 06:49:27

+0

爲什麼呢?什麼版本的.NET?並且請清楚你想要什麼。 – 2011-06-06 07:32:59

0

舊的答案,假設你有XML的控制

你可以嘗試創造你想要的數據結構,嘲諷了用於填充數據結構的控制檯應用程序,並使用XmlSerializer自動輸出示例XML文件。 C#將能夠導入沒有額外代碼的結果。

如果要定製XML,可以使用System.Xml.Serialization名稱空間中的屬性標記代碼並獲取自定義元素/屬性名稱。

編輯:

移除代碼示例,因爲它並不適用於最終的答案。

您擁有的XML不利於C#中的簡單XML序列化。如果你在我的答案的舊版本中提出的建議,你會發現這是真的。

我建議你在C#中用C#創建分層數據結構,映射到你試圖解決的問題,而不是試圖繞着你碰巧擁有的XML數據彎曲它們。

一旦你有了這種結構,就可以爲每種數據類型實現IXmlSerializable

請注意,自定義XML序列化是一種痛苦,所以如果可以的話,您應該讓序列化/數據支持您的代碼,而不是其他方式。

您可以通過編寫一個XSLT來將您的數據轉換爲更適合於XML序列化的格式來解決這個問題。這裏有一個辦法適用於C#XSLT轉換:

How to apply an XSLT Stylesheet in C#

如果你這樣做,我原來的答覆適用。製作一個數據結構,該數據結構可以很容易地從中間格式序列化。

+0

我已經有了我想要在這裏創建樹的xml。 – Sara 2011-06-06 06:53:57

+0

@Sara:找到了。我編輯了我的答案,以更多地適用於您的情況。最終,XML序列化是在數據結構和XML之間進行轉換的最佳方式。不幸的是,這將是更多的工作。不過,如果您試圖直接針對XML工作,或者如果您編寫不使用XML序列化的XML - >數據轉換器,您會更高興地編寫最終結果。 – 2011-06-06 07:08:24

5

假設其ASCII藝術你想...這一個班輪Linq查詢:

string tree = doc.Root.DescendantsAndSelf().Aggregate("", 
    (bc, n) => bc + n.Ancestors().Aggregate("", (ac, m) => (m.ElementsAfterSelf().Any() ? "| " : " ") + ac, 
    ac => ac + (n.ElementsAfterSelf().Any() ? "+-" : "\\-")) + n.Name + "\n"); 

將您的XML轉換成這樣:

\-Root 
    \-parent1 
    | +-child 
    | \-child 
    \-parent2 
    +-child 
    \-child 

我會得到獎使其成爲一個單行答案? ;-)

+0

+1,儘管你沒有完全匹配前面的' - >'標記;) – 2011-06-06 07:24:11

+0

這不是一行,只是一個語句。幾乎-1 – 2011-06-06 07:50:08

+1

真的..雖然,作爲一個單線你得到一個非常非常長的滾動條! – ColinE 2011-06-06 07:51:02