C#XML选择多个节点

时间:2014-01-07 11:00:49

标签: c# xml

我正在尝试修改由其他一些Web开发人员构建的网站。

有问题的部分,读取XML数据文件并撤回数据以显示在Google地图上。

他们有一行代码;

string path = Server.MapPath(OutageXmlVirtualPath); //path to XML file

OutageData outages = XMLUtil.Deserialize<OutageData>(path);

Outage outage = outages.Outages.FirstOrDefault(o => o.PostCodes.Any(p => FoundOutagePostcode(p)) && !o.Planned);

它将XML中的第一条记录与用户输入文本框的邮政编码相匹配。 (lastOrDefault也有效)

然而,问题在于,他们输入的邮政编码可能不止一次出现。在XML中的另一个节点中。所以我想要做的就是拉回匹配的XML中的所有记录。不只是第一个。我可以看到有'All'和'SelectMany'方法,但不知道如何在我的代码中实现这些方法。

我认为自己在这个领域是一个完整的新手。

如果有人能够提供任何非常感谢的帮助。

亲切的问候,

克里斯

XML示例

<?xml version="1.0" encoding="utf-16"?>
<OutageData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <TimeStamp>2013-12-16T06:38:00.1706983+00:00</TimeStamp>
  <Outages>
    <Outage>
      <Region>South West</Region>
      <IncidentID>INCD-83651-m</IncidentID>
      <ConfirmedOff>1</ConfirmedOff>
      <PredictedOff>0</PredictedOff>
      <Restored>0</Restored>
      <Status>In Progress</Status>
      <Planned>false</Planned>
      <StartTime>2013-12-14T18:03:00</StartTime>
      <ETR>2013-12-16T12:00:00</ETR>
      <Voltage>LV</Voltage>
      <PostCodes>
        <string>PL1 4RL</string>
        <string>PL2 1AF</string>
        <string>PL2 1AG</string>
        <string>PL2 1AH</string>
      </PostCodes>
      <Sensitive>1</Sensitive>
    </Outage>
    <Outage>
      <Region>West Midlands</Region>
      <IncidentID>INCD-12499-I</IncidentID>
      <ConfirmedOff>0</ConfirmedOff>
      <PredictedOff>0</PredictedOff>
      <Restored>0</Restored>
      <Status>In Progress</Status>
      <Planned>true</Planned>
      <StartTime>2013-12-13T10:00:00</StartTime>
      <ETR xsi:nil="true" />
      <Voltage>HV</Voltage>
      <PostCodes>
        <string>SY7 9AX</string>
        <string>SY7 9AY</string>
        <string>SY7 9AZ</string>
        <string>SY7 9BE</string>
      </PostCodes>
      <Sensitive>0</Sensitive>
    </Outage>
  </Outages>
</OutageData>

1 个答案:

答案 0 :(得分:1)

尝试使用Where

var outagesFound = outages.Outages.Where(o => o.PostCodes.Any(p => FoundOutagePostcode(p)) && !o.Planned);

然后您可以使用outagesfound循环

遍历foreach列表