2013-06-03 220 views
0

嗨,我想从一个XML获得上行节点。例如这里有一个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) 
       { 

       } 

      } 
+0

请提供完整的XML与结束标记。 – mlg

+0

@Tarasov每个USER标签后的'>'是什么? –

+0

顺便说一下,我的答案(大写:'user.Parent.Attribute(“NAME”)。Value')完美地与您的示例... –

回答

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(); 
+0

对象引用没有设置为对象实例:( – Tarasov

+0

@Tarasov。示例xml不符合您的代码如果我用你的xml试试你的代码,则返回空引用异常)。给出一个真实的样本,或者检查属性案例(可能是“NAME”) –

+0

好吧我展示真正的测试xml ... – Tarasov

1

似乎属性区分大小写。

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) 
      { 

      } 
     } 
+0

mhh是使用不是pth到一个xml我使用一个xml字符串,我在我的应用程序中创建但内容是相同的。 – Tarasov

+0

我不明白它为什么适用于你而不是我:D你的例子是正确的,但它不起作用:/ – Tarasov

+0

什么是错误?这行代码是什么?user.Parent.Attribute(“NAME”)。Value;'returns? – mlg

1

以下代码应该适合您。

 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包含 ; using System.Xml.Linq;

相关问题