2008-11-14 3 views
10

Я новичок в .net и C#, поэтому я хочу убедиться, что я использую правильный инструмент для работы.Прогулка дерева XML в C#

XML, который я получаю, представляет собой описание дерева каталогов на другой машине, поэтому он проходит много уровней. Теперь мне нужно сделать XML и создать структуру объектов (пользовательских классов) и заполнить их информацией из ввода XML, например File, Folder, Tags, Property ...

Деревообразец этот XML-вход делает это, на мой взгляд, основным кандидатом на использование рекурсии для ходьбы по дереву.

Есть ли другой способ сделать это в .net 3.5?

Я посмотрел на XmlReaders, но они, кажется, ходить по дереву в линейной форме, на самом деле не то, что я ищу ...

XML, я получаю это часть 3 party 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

Я бы использовал классы XLINQ в System.Xml.Linq (это пространство имен и сборка, которые вам нужно будет ссылаться). Загрузите 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"); 

переменных directoryElements и fileElements будет IEnumerable типа, что означает, что вы можете использовать что-то вроде Еогеасп к петле через все элементы. Один из способов создать элементы вы бы что-то вроде этого:

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 против System.Xml.Linq

Есть целый ряд классов XML, которые были в .NET, начиная с 1,0 дней. Они живут (в основном) в System.Xml. В .Net 3.5 в System.Xml.Linq был выпущен замечательный новый набор классов XML. Я не могу переоценить, насколько они лучше работают, чем старые классы в 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. Ребенок-узлы возвращают коллекцию, а когда коллекция имеет размер 0, вы знаете, что достигнете своего базового варианта.

Использование LINQ также является хорошим вариантом, но я не могу подробно остановиться на этом решении, потому что я не специалист по LINQ.

Как сказал Джон, XmlReader не очень дружелюбен. Если у вас возникнут проблемы с первичными функциями, вы можете захотеть изучить его, но если вы просто хотите выполнить эту работу, перейдите в XmlDocument/ChildNodes, используя рекурсию.

Смежные вопросы