2008-11-14 62 views
10

我是.net和c#的新手,所以我想確保我使用正確的工具進行工作。在C中走XML樹#

我收到的XML是另一臺機器上的目錄樹的描述,所以它深入了很多級別。我現在需要做的是採用XML並創建一個對象結構(自定義類)並使用來自XML輸入的信息填充它們,例如文件,文件夾,標籤,屬性...

樹的結構在我看來,這個XML輸入使得它成爲使用遞歸來遍歷樹的主要候選者。

在.net 3.5中有這樣做的不同方式嗎?

我已經看了XmlReaders,但他們似乎走在樹以線性方式,而不是真的有什麼我正在尋找...

的XML我收到是第三部分黨的API,這是我無法控制的,並且可能會在期貨中發生變化。

我已經研究過反序列化,但它的缺點是(黑盒子的實現,需要聲明成員是一個公共的,慢的,只適用於簡單的對象...)也將它從列表中取出。

感謝您對此的意見。

+0

我問了一個類似的問題,按照鏈接看到一個很好的討論: http://stackoverflow.com/questions/9371541/how-to-create-a-collection-from-list-of-strings-that -represents-a-directory-stru – geekzster 2012-04-03 19:16:08

回答

1

將XML加載到XMLDocument中。然後,您可以使用遞歸遍歷XMLDocuments DOM。

你可能還想看看工廠方法模式來創建你的類,在這裏非常有用。

2

XmlReader不是一個特別友好的API。如果你可以使用.NET 3.5,那麼加載到LINQ to XML很可能是你最好的選擇。你可以很容易地使用遞歸。

否則,XmlDocument仍然會訣竅...只是不那麼愉快。

22

我會在System.Xml.Linq中使用XLINQ類(這是需要引用的名稱空間和程序集)。加載XML到和的XDocument:

XDocument doc = XDocument.Parse(someString); 

接下來,你可以使用遞歸或者僞遞歸循環遍歷子節點。你可以選擇你的子節點,如:

//if Directory is tag name of Directory XML 
//Note: Root is just the root XElement of the document 
var directoryElements = doc.Root.Elements("Directory"); 

//you get the idea 
var fileElements = doc.Root.Elements("File"); 

變量directoryElementsfileElements將IEnumerable的類型,這意味着你可以使用像通過所有元素的一個foreach循環。建立你的元素的一種方法是這樣的:

List<MyFileType> files = new List<MyFileType>(); 

foreach(XElelement fileElement in fileElements) 
{ 
    files.Add(new MyFileType() 
    {  
     Prop1 = fileElement.Element("Prop1"), //assumes properties are elements 
     Prop2 = fileElement.Element("Prop2"), 
    }); 
} 

在這個例子中,MyFileType是您創建表示文件類型。這是一種暴力攻擊,但它會完成工作。

如果你想使用XPath,你將需要使用 System.Xml.XPath。


上的System.Xml的注VS System.Xml.Linq的

有許多自1.0天數一直在淨XML類。這些生活(主要)在System.Xml中。在.Net 3.5中,一系列新的XML類在System.Xml.Linq下發布。我不能過分強調它們比System.Xml中的舊類更合適。我強烈建議他們去.Net程序員,尤其是剛剛進入.Net/C#的人。

+1

+1強調System.Xml和System.Xml.Linq之間的區別。 – 2009-12-06 19:17:42

2

這是一個非常適合遞歸的問題。

更詳細地說明一點什麼其他的海報說,你會希望通過XML裝載到一個System.Xml.XmlDocument,(使用的loadXML負載)開始。

您可以訪問根使用XmlDocument.DocumentElement財產樹,並通過使用的childNodes屬性訪問每個節點的孩子。子節點返回一個集合,當Collection的大小爲0時,就知道你已經達到了你的基本情況。

使用LINQ也是一個不錯的選擇,但我無法詳細說明這個解決方案,因爲我不是一個真正的LINQ專家。

正如喬恩所說,XmlReader不是很友好。如果您最終遇到了perf問題,您可能需要查看它,但如果您只想完成這項工作,請使用遞歸方式與XmlDocument/ChildNodes一起使用。