来自字符串的XDocument XML模式

时间:2014-01-30 12:38:56

标签: c# xml linq-to-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"

例如,这告诉我在结构中我会在此特定XML文件中找到NameDescriptionEdited

我的问题

有什么方法可以使用这些字符串告诉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 的东西,它似乎做了类似于我正在尝试做的事情,但我无法弄清楚如何将它应用到我上面的问题中。

也许还有其他方法?

1 个答案:

答案 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