在C#中如何从XMLDocument中选择特定数据?

时间:2017-06-01 10:25:53

标签: c# xml asp.net-mvc xml-parsing

我通过网络请求获得了以下回复

<Shofar Target_="Base" >
  <RapidOnSite_Pump Key="1" State="Idle" Amount="20" /> 
  <RapidOnSite_Pump Key="2" State="Idle" Amount="15" /> 
  <RapidOnSite_Pump Key="3" State="Despencing" Amount="25"/> 
- <Verb_List>
     <Verb_Item Key="1" Execute="RapidOnSite_Pump_AdHoc" Result="OK" 
      Detail="All Pumps►5" /> 
  </Verb_List>

从这个字符串我只想选择状态不是空闲的节点。

我的代码

 string responseFromServer = MY_RESPONSE
     XmlDocument mainxml = new XmlDocument();
    mainxml.LoadXml(responseFromServer);

  XmlNodeList xnList = mainxml .SelectNodes("/Shofar/RapidOnSite_Pump [@State!='Idle']");

但是通过这个代码,我没有得到任何要求。有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

在聊天中显示真实的xml。它包含必须考虑的名称空间!

mainxml.LoadXml(responseFromServer);

XmlNamespaceManager manager = new XmlNamespaceManager(mainxml.NameTable);
manager.AddNamespace("ns", "http://ShofarNexus.com");

XmlNodeList xnList = mainxml.SelectNodes("/ns:Shofar/ns:RapidOnSite_Pump [@State!='Idle']", manager);

答案 1 :(得分:0)

您可以使用XElement完成工作,除非您想坚持使用XmlDocument。

XElement rootElem = XElement.Load(new StringReader(xmlStr));
var rapidOnSitePumpWhichAreNotIdle = rootElem.Descendants("RapidOnSite_Pump").Where(e => e.Attribute("State").Value != "Idle");

最后,您将获得可以迭代的IEnumerable<XElement>