2016-11-01 80 views
0

我想解析来自REST调用的XML响应。我可以用我的流式阅读器阅读XML,但是当我尝试选择第一个节点时,它什么都没带回来。下面是我的XML:阅读XML节点列表

<?xml version="1.0" encoding="UTF-8" standalone="true"?>  
<slot_meta_data xmlns:ns2="http://www.w3.org/2005/Atom">  
    <product id="MDP">  
     <name>MDP</name>  
    </product>   
    <product id="CTxP">  
     <name>CTxP</name>  
    </product>  
    <product id="STR">  
     <name>STR</name>  
    </product>  
    <product id="ApP">  
     <name>ApP</name> 
     <slot>  
      <agent_id>-1111</agent_id>  
      <agent_name>ApP</agent_name>  
      <index_id>-1</index_id>   
      <alias>App Alias</slot_alias>  
     </slot>  
    </product>   
    <product id="TxP">  
     <name>TxP</name>   
     <slot>  
      <agent_id>2222</agent_id>  
      <agent_name>App2</agent_name>  
      <index_id>-1</index_id>  
      <alias>App2 Alias</slot_alias>  
     </slot>  
    </product>  
</slot_meta_data> 

这里是我的代码

string newURL = "RESTURL"; 

HttpWebRequest request = WebRequest.Create(newURL) as HttpWebRequest; 
HttpWebResponse response = request.GetResponse() as HttpWebResponse; 

StreamReader reader = new StreamReader(response.GetResponseStream()); 

XmlDocument xdoc = new XmlDocument(); 
xdoc.Load(response.GetResponseStream()); 

XmlNodeList list = xdoc.SelectNodes("/slot_meta_data[@*]"); 

foreach (XmlNode node in list) 
{ 
    XmlNode product = node.SelectSingleNode("product"); 
    string name = product["name"].InnerText; 
    string id = product["id"].InnerText; 

    Console.WriteLine(name); 
    Console.WriteLine(id); 
    Console.ReadLine(); 
} 

当调试列表中,它具有0

+0

有'slot_meta_data'元素没有属性......只是一个名称空间声明。 –

回答

1

计数使用XML LINQ

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 


namespace ConsoleApplication22 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\TEMP\TEST.XML"; 
     static void Main(string[] args) 
     { 

      XDocument doc = XDocument.Load(FILENAME); 

      var results = doc.Descendants("product").Select(x => new { 
       name = (string)x.Element("name"), 
       slot = x.Elements("slot").Select(y => new { 
        agent_id = (int)y.Element("agent_id"), 
        agent_name = (string)y.Element("agent_name"), 
        index_id = (int)y.Element("index_id"), 
        slot_alias = (string)y.Element("slot_alias") 
       }).FirstOrDefault() 
      }).ToList(); 

     } 

    } 

} 
+0

谢谢。这很好。所以我试图把它包装到一个foreach循环中以逐一获取它们。我可以得到产品属性(foreach(var result in results)),但是当我尝试获取插槽属性时,我将“对象未设置为对象的实例”。我正在使用int agent_id = result.slot.agent_id – maltman

+0

您不需要包装在for循环中。只需在Linq之后枚举for循环中的变量结果即可。并非所有xml文件中的产品都有插槽。前三款产品没有插槽,只有最后两款。 – jdweng

+0

所以我添加了一个if来检查slot = null。然后在其他地方我添加了另一个foreach循环插槽。这可以吗? – maltman