2008-11-14 16 views
10

.net ve C# konusunda yeniyim, bu yüzden iş için doğru aracı kullandığınızdan emin olmak istiyorum.C# içinde bir XML ağacında yürüyüş #

Almakta olduğum XML, başka bir makinede bir dizin ağacının açıklamasıdır, bu nedenle çok sayıda düzeye gider. Şimdi yapmam gereken şey XML'i alıp nesnelerin bir yapısını (özel sınıflar) oluşturmak ve bunları XML girdisinden, Dosya, Klasör, Etiketler, Mülkler, vb. Gibi bilgilerle doldurmaktır.

Bu XML girdisi, aklımda, ağacın yürümesi için özyinelemeyi kullanmaya aday bir adaydır.

Bunu .net 3.5'de yapmanın farklı bir yolu var mı?

Ben XmlReaders baktım ama doğrusal bir biçimde ağacı yürüme gibi görünüyor, ben için ... ben alıyorum

XML arıyorum gerçekten ne 3rd parçasıdır parti api, benim kontrolümün dışında ve geleceklerde değişebilir.

Deserialization'a baktım, ama eksiklikler (kara kutu uygulaması, üyelerin halka açık, yavaş, sadece basit nesneler için çalışmasına gerek duyuyor ...) bunu listeden çıkarır.

Bu konudaki girdiniz için teşekkür ederiz.

+0

Benzer bir soru sordum, iyi bir tartışmayı görmek için bağlantıyı takip edin: http://stackoverflow.com/questions/9371541/how-to-create-a-collection-from-list-of-strings-that System.Xml ve System.Xml.Linq arasındaki farkın vurgulanması için -represents-a-directory-stru – geekzster

cevap

1

XML'inizi XMLDocument içine yükleyin. Sonra XMLDocuments DOM ile özyinelemeyi yürütebilirsiniz.

Ayrıca, sınıflarınızı oluşturmak için fabrika yöntem modeline de bakmak isteyebilirsiniz, burada çok yararlı olacaktır.

2

XmlReader özellikle kolay bir API değildir. .NET 3.5'i kullanabiliyorsanız, LINQ'a XML'e yükleme yapmak en iyi ihtimalle size ait olacaktır. Yinelemeyi bununla kolayca kullanabilirsiniz.

Aksi halde, XmlDocument yine de hile yapar ... sadece biraz daha hoş.

22

XLINQ sınıflarını System.Xml.Linq dosyasında kullanırım (bu, başvurmanız gereken ad alanı ve derleme). ve XDocument içine XML yükleme:

XDocument doc = XDocument.Parse(someString); 

Sonra kullanılması tekrarlama veya sözde tekrarlama döngü ya çocuk düğümler tekrarlatacak yapabilirsiniz. Eğer tüm öğeleri döngü için bir foreach gibi bir şey kullanabilirsiniz anlamına gelen IEnumerable tipleri olacak

//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"); 

değişkenler directoryElements ve fileElements: Sen gibi size çocuk düğümleri seçebilir. Örnekte

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 dosyaları temsil etmek oluşturulan bir türüdür: size unsurları oluşturmak için bir yolu böyle bir şey olurdu. Bu biraz kaba kuvvet saldırısıdır, ama işi halleder.

Eğer XPath kullanmak isterseniz, System.Xml.XPath kullanarak gerekir.


1,0 gündür Net olmuştur XML sınıfları vardır System.Xml.Linq vs System.XML Üzerine Bir Not. Bunlar (çoğunlukla) System.Xml içinde yaşıyor. .Net 3.5, System.Xml.Linq altında yeni ve harika bir XML sınıfı kümesi yayımlandı. System.Xml'deki eski sınıflardan daha iyi çalışacaklarını daha fazla vurgulayamıyorum. Ben kesinlikle herhangi bir .Net programcı ve özellikle birisi sadece .Net/C# içine almak için tavsiye ederim.

+1

+1. –

2

Bu, özyineleme için çok uygun bir sorundur.

başka afiş, siz ( LoadXml veya Yük kullanarak) System.Xml.XmlDocument, içine XML yükleyerek başlamak isteyeceksiniz söylediklerini biraz daha ayrıntılı için.

Sen XmlDocument.DocumentElement özelliğini kullanarak ağacın kökünü erişebilir ve childNodes özelliğini kullanarak her düğümün çocukları erişebilirler. Çocuk düğümleri bir koleksiyon döndürür ve Koleksiyon boyutu 0 olduğunda, temel durumunuza ulaştığınızı bilirsiniz.

LINQ kullanımı da iyi bir seçenektir, ancak bu çözüm üzerinde ayrıntılı olarak çalışamıyorum, çünkü aslında bir LINQ uzmanı değilim.

Jon'un belirttiği gibi, XmlReader çok arkadaşça değildir. Eğer mükemmel bir konuya sahip olursanız, içine bakmak isteyebilirsiniz, ancak sadece işi bitirmek istiyorsanız, tekrarlamayı kullanarak XmlDocument/ChildNodes ile gidin.

İlgili konular