【问题标题】:How I get the parentnode attribute name if I have the attribute name of the child node?如果我有子节点的属性名称,如何获取父节点属性名称?
【发布时间】:2013-05-29 08:58:58
【问题描述】:

嗨,我想从 xml 中获取 up 节点。比如这里是一个xml结构...

<feature name="mod1">
  <user name="user1"></user>
  <user name="user2"></user>
  <user name="user3"></user>
</feature>

我在我的应用程序中有用户名,我想要的不是节点功能名称属性。

XmlReader reader = XmlReader.Create(new StringReader(xml));

            XElement doc = XElement.Load(reader);

            int counter = 0; 
            foreach (XElement user in doc.Descendants("USER"))
            {
                try
                {
                    row = tb.NewRow();
                    row["ID"] = counter++;
                    row["Name"] = user.Attribute("NAME").Value;
                    row["Host"] = user.Attribute("HOST").Value;
                    row["Used_Licenses"] = user.Attribute("USED_LICENSES").Value;
                    row["Checkout_Time"] = user.Attribute("CHECKOUT_TIME").Value;


                   row["Modul"] = user.Parent.Attribute("NAME").Value; //don't work :(

                    tb.Rows.Add(row); 
                }
                catch (Exception)
                {

                }

            }

【问题讨论】:

  • 请为整个xml提供结束标记。
  • @Tarasov 每个 USER 标签后面的&gt; 是什么?
  • 顺便说一句,我的答案(大写:user.Parent.Attribute("NAME").Value)与您的示例完美搭配...
  • 我不知道,但我从其他程序获得的 xml ......所以我必须与他们合作:/
  • 我通过这个 xml 获得所有用户和功能,但如果我有用户名,我不知道如何获得功能名称:D :(

标签: c# asp.net xml datatable nodes


【解决方案1】:

你应该可以得到它

user.Parent.Attribute("NAME").Value;

这适用于:

<LM-X STAT_VERSION="3.32">
<LICENSE_PATH >
<FEATURE NAME="GlobalZoneEU" >
<USER NAME="SYSTEM" HOST="LRV171" IP="172.16.11.115" USED_LICENSES="2000" LOGIN_TIME="2013-04-17 12:42" CHECKOUT_TIME="2013-04-17 12:42" SHARE_CUSTOM="hweuser:172.16.11.115"/>
<USER NAME="pbsadmin" HOST="SERV11" IP="172.16.11.115" USED_LICENSES="720" LOGIN_TIME="2013-04-17 12:44" CHECKOUT_TIME="2013-04-17 12:44" SHARE_CUSTOM="pbsadmin:LWSERV171:1592_40960072_1356792762_826820"/>
</FEATURE>
</LICENSE_PATH>
</LM-X>

编辑

通过用户名获取功能名称:

var featureNames = xDoc.Descendants("USER")
                        .Where(x => x.Attribute("NAME").Value == <your input>)
                        .Select(x => x.Parent.Attribute("NAME").Value);

var firstFeatureName = featureNames.FirstOrDefault();

【讨论】:

  • 对象引用未设置为对象实例。 :(
  • @Tarasov。示例 xml 与您的代码不对应(如果我使用您的 xml 尝试您的代码,则会出现许多 Null Ref 异常)。给一个真实的样本,或者检查属性大小写(可能是“NAME”)
  • @Tarasov : 请关闭标签。
  • 你确定Row["Modul"]存在吗?
【解决方案2】:

似乎属性区分大小写。

XmlReader reader = XmlReader.Create(\\File Path);

        XElement doc = XElement.Load(reader);

        int counter = 0;
        foreach (XElement user in doc.Descendants("USER"))
        {
            try
            {
                string node = user.Parent.Attribute("NAME").Value; //Working - Returning 'GlobalZoneEU'
            }
            catch (Exception)
            {

            }
        }

【讨论】:

  • mhh 不是使用 xml 的 pth 我使用的是我在应用程序中创建的 xml 字符串,但内容是相同的。
  • 我不明白为什么它适用于你而不是我 :D 你的例子是对的,但它不起作用:/
  • 错误是什么?这行代码user.Parent.Attribute("NAME").Value;返回的是什么?
  • 能否提供xml字符串?
  • 好的,但可以使用 user.Parent.Parent.Attribute("NAME").Value; :D:D
【解决方案3】:

下面的代码应该适合你。

        string xml = "<feature name=\"mod1\">";
        xml += "<user name=\"user1\"> </user>";
        xml += "<user name=\"user2\"> </user> ";
        xml += "<user name=\"user3\"></user>";
        xml += "</feature>";

        XmlDocument xdoc=new XmlDocument();
        xdoc.LoadXml(xml);

        XDocument mydoc = XDocument.Parse(xdoc.OuterXml);

        var result = mydoc.Elements("feature").Where(parent =>
                          parent.Elements("user").Any(child =>   
                          child.Attribute("name").Value == "user2"));

别忘了包括 使用 System.Xml; 使用 System.Xml.Linq;

【讨论】: