【问题标题】:Getting nested XML attribute value using XmlDocument使用 XmlDocument 获取嵌套的 XML 属性值
【发布时间】:2013-06-13 23:47:33
【问题描述】:

前身

您实际上并不需要知道但可能有助于解决问题的一点是,我正在 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);

问题

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

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

我怎样才能做到这一点?

【问题讨论】:

  • 我能问一下您为什么使用 XmlDocument 吗?它于 2008 年被 XDocument 和 XElement 取代。
  • @JoeAlbahari,我正在使用 XmlDocument,因为我不知道它在 2008 年被 XDocument 和 XElement 取代 :-) ...我现在知道这一点,也许是时候很少的研究和重构!
  • XDocument 的众多优点之一是您不必学习 XPath。使用 LINQ 查询它的方式与查询任何其他类型的集合相同。在您的情况下,查询是这样的: string result = (string) XElement.Parse (xmlString).Elements("item").Single(i => (string)i.Attribute("name") == "PATH_INFO" ).Element("value").Attribute("string")
  • @JoeAlbahari,谢谢,这绝对比 XmlDocument 更有希望。有趣的是,在我们讨论这个问题时,我的经理给我发了一封电子邮件,其中包含使用 XDocument 的更短的实现:-)

标签: c# xml linq traversal linqpad


【解决方案1】:

[一旦你有了一个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;
}

【讨论】:

  • 有效! :-) 谢谢!。如果我没有错过层次结构中的标签,可能会有所帮助! 掌心
【解决方案2】:
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xmlString);
        var value = doc.SelectSingleNode("error/item[@name='PATH_INFO']/value/@string").Value;

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 2010-11-05
    相关资源
    最近更新 更多