2013-06-03 224 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;

相關問題