2014-01-21 48 views
0

我需要將XML數據加載到newtonsoft JObject和特定名稱&值節點查詢...查詢與特定的屬性值jobject孩子

這只是一個簡單的示例,問題是在最後一行碼,resultSecondLevel爲null即使有resultFirstLevel與ID元素子我正在尋找...

例如:

int idFirst = 2; 
      int idSecond = 4; 
      string json = string.Empty; 
      JObject jFirstLevels = new JObject(); 

      string xml = "<Root><FirstLevel id=\"1\"><Secondlevel id=\"1\" value=\"hello11\" /><Secondlevel id=\"2\" value=\"hello12\" /><Secondlevel id=\"3\" value=\"hello13\" /></FirstLevel><FirstLevel id=\"2\"><Secondlevel id=\"4\" value=\"hello24\" /></FirstLevel><FirstLevel id=\"3\"><Secondlevel id=\"5\" value=\"hello35\" /><Secondlevel id=\"6\" value=\"hello36\" /><Secondlevel id=\"7\" value=\"hello37\" /></FirstLevel></Root>"; 

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

      XmlNodeList nodeList; 
      nodeList = xmlDoc.SelectNodes("Root/FirstLevel"); 
      if (nodeList != null) 
      { 
       if (nodeList.Count > 1) 
       { 
        JArray jarray = new JArray(); 

        foreach (XmlNode node in nodeList) 
        { 
         json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(node); 
         jarray.Add(JObject.Parse(json)); 
        } 
        jFirstLevels["result"] = jarray; 
       } 
      } 

      JObject resultFirstLevel = jFirstLevels["result"].Children<JObject>().FirstOrDefault(x => x["FirstLevel"]["@id"].Value<int>() == idFirst); 
      JObject resultSecondLevel = resultFirstLevel.Children<JObject>().FirstOrDefault(x => x["SecondLevel"]["@id"].Value<int>() == idSecond); 

回答

0

這是因爲你JProperty的resultFirstLevel列表。
您需要使用此代碼轉換,例如:

JObject resultFirstLevel = jFirstLevels["result"].Children<JObject>().FirstOrDefault(x => x["FirstLevel"]["@id"].Value<int>() == idFirst); 
var firstlevelProperty = resultFirstLevel.Children().Cast<JProperty>().Select(x => x.Value); 
var resultSecondLevel = firstlevelProperty.FirstOrDefault(x => x["Secondlevel"]["@id"].Value<int>() == idSecond); 

(除了有你輸入的XML和測試之間的一個錯字:它的「第二級別」以較低的「L」)