2014-01-30 6 views
2

СитуацияXDocument шаблон XML из строки

Я использую XDocument для загрузки XML-файлы из множества различных источников. Все они содержат почти одинаковый тип информации, но структура XML очень отличается.

Это упрощенный пример того, что я делаю сегодня для одного источника:

string path = @"some_file.xml"; 
var doc = XDocument.Load(path); 
var root = doc.Root; 
foreach (var node in root) 
{ 
    User u = new User(); 

    u.Name = node.Element("User").Element("Information").Attribute("Name").Value; 
    u.Description = node.Element("User").Element("Description").Value; 
    u.Edited = node.Element("User").Element("Description").Attribute("Edited").Value; 
    /* ...and so on. */ 

    listOfUsers.add(u); 
} 

Это работает, но я хотел бы сделать его более динамичным. Как это происходит, у меня уже есть строки, содержащие точно, где искать мои свойства отформатированных, как это:

"Element:User->Element:Information->Attribute:Name" 
"Element:User->Element:Description" 
"Element:User->Element:Description->Attribute:Edited" 

Это, например, говорит мне, где в структуре я нашел бы Name, Description и Edited в данном файле XML ,

Мой вопрос

Есть ли способ, что я могу использовать эти строки, чтобы сказать XDocument, где искать? Другими словами, можно ли каким-либо образом динамически преобразовать приведенные выше строки в это?

u.Name = node.Element("User").Element("Information").Attribute("Name").Value; 
u.Description = node.Element("User").Element("Description").Value; 
u.Edited = node.Element("User").Element("Description").Attribute("Edited").Value; 

То, что я пытался

я нашел то, что называется Отражение, что, кажется, сделать что-то подобное тому, что я пытаюсь сделать, но я не могу понять, как применять это моя проблема выше.

Возможно, есть и другие способы?

+0

Я не уверен, но вы можете попробовать использовать [ 'Expressions'] (http://msdn.microsoft.com/en-us/library/system.linq.expressions (v = vs.110) .aspx) – Yuriy

ответ

2

Помните, что у вас также есть возможность XPath

Так все, что вам нужно сделать, это перевести строку путь из этого: (После перехода корня)

`Element:User->Element:Information->Attribute:Name` 

к: (пропустить свой корень)

`/*/User/Information/@Name` 

, который затем позволит вам сделать так:

var name = document.XPathSelectElement("/Root/User/Information/@Name").Value; 

Если Пространства имен представляют проблему, у вас также есть опция агностических путей, с local-name(), например.

/*[local-name()='Root']/*[local-name()='User']/*[local-name()='Information']/@Name 
+0

Очень приятно! Это похоже на то, что я мог бы использовать, и преобразование моих предыдущих строк в них не должно быть проблемой. Благодаря! –

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