使用XmlDocument获取嵌套的XML属性值

时间:2013-06-13 15:24:24

标签: c# xml linq traversal linqpad

前体

你真的不需要知道,但可能有助于解决问题的是,我在LINQPad中编写一系列C#语句,它从ELMAH(错误记录系统)数据库中获取记录集合,从每个记录中提取XML(AllXml)字段,并将每个提取加载到XmlDocument中。好吧,这似乎相当容易,但现在我需要遍历每个文档并从中获取特定值。

XML结构示例

注意:我在此处删除了任何可能的机密信息......

<error type="System.Exception" time="2013-06-11T17:27:28.0122874Z">
    <item name="PATH_INFO">
      <value string="/foo/bar/thisIsTheValueIWant.aspx" />
    </item>
    <item name="PATH_TRANSLATED">
      <value string="C:\site\foo\bar\thisIsPotentiallyAnotherValueIMightWant.aspx" />
    </item>
    <item name="QUERY_STRING">
      <value string="meh" />
    </item>
</error>

考虑到这个XML作为字符串存在,我已经加载了这样:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);

问题

获取节点的值并不太难,但在这种情况下,该值存储为节点的属性,我不知道如何遍历该节点!

我基本上需要将value节点嵌套在item节点中,并name"PATH_INFO",然后获取"string"属性的值

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

[一旦有XmlNode个对象,您可以要求提供Attributes集合,并按名称获取所需的对象。

一个例子:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
XmlNode itemNode = doc.SelectSingleNode("/error/item[@name = 'PATH_INFO']");
if (itemNode != null)
{
    XmlNode value = itemNode.SelectSingleNode("value");
    String valueString = value.Attributes["string"].Value;
}

答案 1 :(得分:1)

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xmlString);
        var value = doc.SelectSingleNode("error/item[@name='PATH_INFO']/value/@string").Value;