情况
我正在使用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"
例如,这告诉我在结构中我会在此特定XML文件中找到Name
,Description
和Edited
。
我的问题
有什么方法可以使用这些字符串告诉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;
我尝试了什么
我发现了一些名为 Reflection 的东西,它似乎做了类似于我正在尝试做的事情,但我无法弄清楚如何将它应用到我上面的问题中。
也许还有其他方法?
答案 0 :(得分:2)
请记住,您还可以选择XPath
所以你需要做的就是从这里翻译你的字符串路径:(导航root后)
`Element:User->Element:Information->Attribute:Name`
to :(跳过你的根)
`/*/User/Information/@Name`
然后你可以这样做:
var name = document.XPathSelectElement("/Root/User/Information/@Name").Value;
如果命名空间出现问题,您还可以选择使用local-name()
的不可知路径,例如
/*[local-name()='Root']/*[local-name()='User']/*[local-name()='Information']/@Name