2012-06-15 106 views
0

今天是我第一次接觸到LINQ,所以說我是新手是輕描淡寫..所以我想要做的是解析STAT元素的值和他們的屬性。我的示例XML看起來像這樣。解析XML元素及其在LINQ中的屬性

<ILS TGT="00-25-CE-94-00-05" PID="404001C5354144E4DA40E01F5000002" ORGCODE="00010019" xmlns="Mytest/v1.0"> 
    <STAT TIME="000000018" TYPE="SYS" FIELD="PWR_V" VAL="1196"/> 
    <STAT TIME="000000018" TYPE="CAN" NID="65" FIELD="LAST_EC" VAL="EC_HEARTBEAT_TIMEOUT"/> 
    <STAT TIME="000000018" TYPE="NWK" FIELD="W_RSSI" VAL="-85"/> 
    <EVT TIME="0000000017" TYPE="ACC" SUBTYPE="GRANTED" CRDT="DPIN" CRED1="1212"/> 
    <EVT TIME="0000000018" TYPE="ACC" SUBTYPE="GRANTED" CRDT="DPIN" CRED1="1212" CRED2="2345"/> 
    <EVT TIME="0000000019" TYPE="ACC" SUBTYPE="DENIED" CRDT="OCRD" CRED1="0000DE0871"/> 
    <EVT TIME="0000000020" TYPE="ACC" SUBTYPE="GRANTED" CRDT="DCRD" CRED1="0000DE0871" CRED2="2345"/> 
    <EVT TIME="0000000021" TYPE="CFG" SUBTYPE="RELOCK_TIME" VAL="300"/> 
    <EVT TIME="0000000022" TYPE="LOG" SUBTYPE="HB_TIMEOUT" VAL="65"/> 
</ILS> 

因此,在這個板上搜索,我發現以下question它回答我的問題。然而,我申請了這個,出於某種原因,我根本得不到任何結果,任何人都可以快速查看並指出我做錯了什麼?

public static void ParseXML(string data) 
    { 
     try 
     { 
      XDocument xDoc = XDocument.Parse(data); 

      XElement root = xDoc.Root; 

      Console.WriteLine("TGT: " + root.Attribute("TGT").Value + "\n"); 
      Console.WriteLine("PID: " + root.Attribute("PID").Value + "\n"); 
      Console.WriteLine("ORGCODE: " + root.Attribute("ORGCODE").Value + "\n"); 
      Console.WriteLine("xmlns: " + root.Attribute("xmlns").Value + "\n"); 

      //Everything above this line is good, I was able to get the print out. 

      var eleSTAT = from node in xDoc.Descendants("STAT") 
          select new 
          { 
           attrTIME = node.Attribute("TIME").Value, 
           attrTYPE = node.Attribute("TYPE").Value, 
           attrFIELD = node.Attribute("FIELD").Value, 
           attrVAL = node.Attribute("VAL").Value, 
          }; 

      //When I run my code, it never got into this foreach loop, aas if eleSTAT is empty 
      foreach (var s in eleSTAT) 
      { 
       Console.WriteLine("TIME: " + s.attrTIME + "\n"); 
       Console.WriteLine("TYPE: " + s.attrTYPE + "\n"); 
       Console.WriteLine("FIELD: " + s.attrFIELD + "\n"); 
       Console.WriteLine("VAL: " + s.attrVAL + "\n"); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 


    } 

而我的最後一個問題,因爲我有多個STAT元素,將上述工作?我想讓所有4個STAT元素及其屬性返回給我。我認爲這必須在某種類型的循環中完成?我是否正確地說我的foreach循環應該已經做到了這一點?

+1

空的LINQ查詢是對SO一個共同的問題。這裏的答案應該有助於解決您的問題:http://stackoverflow.com/q/2340411/250725 – psubsee2003

+1

爲了回答您在編輯中添加的最後一個問題....一旦您在查詢中解決了名稱空間問題,應該返回4個對象的集合,每個''元素一個。 LINQ查詢實際上正在爲您檢索每個循環 – psubsee2003

回答

1

您必須提供Descendants的XML名稱空間。

更改您這樣的代碼:

... 
XNamespace xmlns = "Mytest/v1.0"; 
var eleSTAT = from node in xDoc.Descendants(xmlns + "STAT") 
...