【问题标题】:Reading <property> tag读取 <property> 标签
【发布时间】:2012-10-18 01:46:47
【问题描述】:

我今天被要求看一个新项目 - 阅读一些 XML 并进行一些分析。我知道一点 C#。到目前为止,我已经用这段代码做到了这一点。我成功获得了 4 个节点列表。我有几个问题。首先,我不确定如何访问任何列表中任何节点上的标签中的内容。其次,我希望能够使用 LINQ 查询,但 XmlNodeList 似乎不支持该语法。在下面的示例 XML 中,我希望能够获取属于特定 IO 组或 mdisk 的所有虚拟磁盘,由 io_group_name 或 mdisk_grp_name 属性确定。我看到的大部分内容都提供了访问 [Attribute] 列表并搜索所有使用的属性/属性互换的示例。

我尝试的也在下面,它给出了一个空值异常。属性列表只有一个属性。我找不到任何示例来做我想做的事,并且在调试器中检查节点并不清楚我需要访问什么来做我想做的事。

//this works

XmlTextReader reader = new XmlTextReader(_InputFile);
XmlDocument doc = new XmlDocument();
doc.Load(reader);

XmlNodeList clusterlist = doc.SelectNodes("//object[@type='cluster']");
XmlNodeList controllerlist = doc.SelectNodes("//object[@type='controller']");
XmlNodeList mdisklist = doc.SelectNodes("//object[@type='mdisk']");
XmlNodeList vdisklist = doc.SelectNodes("//object[@type='vdisk']");


// this did not work - got null value exception
foreach (XmlNode vdisknode in vdisklist)
{
    string str = vdisknode.Attributes["mdisk_grp_name"].Value;
}

XML 示例:

<object type="vdisk">
     <property name="id" value="0" />
     <property name="name" value="nim01_vd06_gmt" />
     <property name="IO_group_id" value="0" />
     <property name="IO_group_name" value="ossvc06_iogrp0" />
     <property name="status" value="online" />
     <property name="mdisk_grp_id" value="0" />
     <property name="mdisk_grp_name" value="T1_OSIBM06_MDG1" />
     <property name="capacity" value="644245094400" />
     <property name="type" value="striped" />
</object>

【问题讨论】:

    标签: c# .net xml xpath


    【解决方案1】:

    object节点只有一个属性:type

    string type = vdiskNode.Attributes["type"].Value;
    

    property节点有两个属性:namevalue

    string name = propertyNode.Attributes["name"].Value;
    string value = propertyNode.Attributes["value"].Value;
    

    我认为你需要的是扩展 XPath 查询:

    "//object[@type='vdisk']/property[@name='mdisk_grp_name']/@value"
    

    或者使用 LINQ to XML:

    from obj in doc.Load(xml).Root.Elements("object")
    where (string)obj.Attribute("type") == "vdisk"
    from prop in obj.Elements("property")
    //where (string)prop.Attribute("name") == name
    select prop.Value
    

    【讨论】:

    • vdisknode.Atttributes[] 有一个条目。 Name 的字符串值为“type”,Value 的字符串值为“vdisk”。你的回答确实有帮助。我在 vdisknode.ChildNodes 中找到了我想要的
    • @DavidGreen:我猜vdisknode.Atttributes[] 有一个条目,它是type,对吗?所以是的,您确实需要子节点的 (property) 名称和值。
    • @abatischev 感谢您对 LINQ 的帮助。根据 Stackoverflow,我想出了另一个适用于 XDocument 的版本,但您的版本适用于其他版本。
    猜你喜欢
    • 2011-06-21
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2015-07-21
    相关资源
    最近更新 更多