首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用c#在每个实用工具(XML数据)中对所有城市的人口进行之和?

如何使用c#在每个实用工具(XML数据)中对所有城市的人口进行之和?
EN

Stack Overflow用户
提问于 2014-01-09 11:13:09
回答 3查看 141关注 0票数 1

我有以下xml文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<DetailedUtilityCollection SchemaVersion="1.0">
<DetailedUtility UtilityId="720" UtilityName="Chelan County Public Utility District" CountryCode="US" StateCode="WA">
  <Rate Id="2350" Name="Residential Service (Schedule 1)" Sector="Residential" Metering="OptionalNetMetering" IsDefault="true" IsTimeOfUse="false" />
  <Rate Id="2351" Name="General Service - Nondemand (Schedule 2)" Sector="Commercial" Metering="OptionalNetMetering" IsDefault="true" IsTimeOfUse="false" />
  <Rate Id="2352" Name="General Service - Demand (Schedule 2)" Sector="Commercial" Metering="OptionalNetMetering" IsDefault="false" IsTimeOfUse="false" />
  <City Name="Cashmere" Population="7233">
     <CityLocation Zip="98815" Lat="47.53593" Lng="-120.494571" />
  </City>
  <City Name="Chelan" Population="6394">
     <CityLocation Zip="98816" Lat="47.901204" Lng="-120.139618" />
  </City>
  <City Name="Entiat" Population="1953">
     <CityLocation Zip="98822" Lat="47.885389" Lng="-120.47078" />
  </City>
  <City Name="Leavenworth" Population="6504">
     <CityLocation Zip="98826" Lat="47.82259" Lng="-120.825267" />
  </City>
  <City Name="Wenatchee" Population="40977">
     <CityLocation Zip="98801" Lat="47.451974" Lng="-120.330783" />
     <CityLocation Zip="98802" Lat="47.494001" Lng="-120.193856" />
     <CityLocation Zip="98807" Lat="47.4236" Lng="-120.3092" />
  </City>
  <City Name="West Wenatchee" Population="40977">
     <CityLocation Zip="98801" Lat="47.451974" Lng="-120.330783" />
  </City>
  </DetailedUtility>
  <DetailedUtility UtilityId="721" UtilityName="Clallam County PUD" CountryCode="US" StateCode="WA">
  <Rate Id="2353" Name="General Service - Residential, Farm (Schedule E-4)" Sector="Residential" Metering="OptionalNetMetering" IsDefault="true" IsTimeOfUse="false" />
  <Rate Id="2354" Name="General Service - Commercial (Schedule E-4)" Sector="Commercial" Metering="OptionalNetMetering" IsDefault="true" IsTimeOfUse="false" />
  <Rate Id="2355" Name="Large Power Service (Schedule E-5)" Sector="Commercial" Metering="OptionalNetMetering" IsDefault="false" IsTimeOfUse="false" />
  <City Name="Forks" Population="6261">
     <CityLocation Zip="98331" Lat="47.851473" Lng="-124.28411" />
  </City>
  <City Name="Neah Bay" Population="1414">
     <CityLocation Zip="98357" Lat="48.332856" Lng="-124.639563" />
  </City>
  <City Name="Port Angeles" Population="22230">
     <CityLocation Zip="98362" Lat="47.99614" Lng="-123.38281" />
     <CityLocation Zip="98363" Lat="48.017263" Lng="-123.824588" />
  </City>
  <City Name="Port Angeles East" Population="-1" />
  <City Name="Sequim" Population="26856">
     <CityLocation Zip="98382" Lat="48.025762" Lng="-123.061784" />
  </City>
  </DetailedUtility>
  </DetailedUtilityCollection>

我怎样才能在c#的每一个功利品中得到所有城市人口的总和。请帮帮我。

我试过遵循密码,但没有一个对我有用。

代码语言:javascript
复制
xmlDoc.LoadXml(strFetchResData);

                        //dynamic BillUtilityData = JsonConvert.SerializeXmlNode(xmlDoc).Replace(@"@", @"").Remove(1, 44);
                        //dynamic BillUtilityData  = JsonConvert.DeserializeObject<dynamic>(JsonConvert.SerializeXmlNode(xmlDoc).Replace(@"@", @"").Remove(1, 44));
                        //dynamic BillUtilityData = JsonString;
                        XmlNodeList utilitylist = xmlDoc.DocumentElement.ChildNodes;

                        if (utilitylist.Count > 0)
                        {
                            foreach (XmlNode nodeUtil in utilitylist)
                            {
                                double? totalPopulation = 0;
                                //xmlDoc.Load(nodeUtil.InnerXml.ToString());
                                dynamic BillUtilityData = JsonConvert.DeserializeObject<dynamic>(JsonConvert.SerializeXmlNode(nodeUtil).Replace(@"@", @"").Remove(1, 44));
                                //totalPopulation = Convert.ToDouble((nodeUtil).LastChild.Attributes["Population"].Value);
                                //xmlDoc.LoadXml(nodeUtil.InnerText);


                                //foreach (XmlNode cityUtil in nodeUtil["City"])
                                //{
                                //    totalPopulation = SunpowerServiceMethods.calculateTotalPopulationOfCitySiblings(cityUtil,totalPopulation);
                                //    break;
                                //}

                            }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-09 11:19:23

编辑:因此,您的真品文件已经声明了名称空间,您应该处理它们。

我建议您使用LINQ。对于每个实用程序元素,使用Enumerable.Sum,选择其城市人口的和:

代码语言:javascript
复制
var xdoc = XDocument.Load(path_to_xml);
var ns = xdoc.Root.GetDefaultNamespace();
var query = from u in xdoc.Root.Elements(ns + "DetailedUtility")
            select new
            {
                UtilityId = (int)u.Attribute("UtilityId"),
                TotalPopulation = u.Elements(ns + "City")
                                   .Sum(c => (int)c.Attribute("Population"))
            };

返回:

代码语言:javascript
复制
{ UtilityId = 720, TotalPopulation = 104038 }
{ UtilityId = 721, TotalPopulation = 56760 }
票数 3
EN

Stack Overflow用户

发布于 2014-01-09 11:24:13

这应该可以做到:

代码语言:javascript
复制
    var xml = "all your xml";
    var doc = XDocument.Parse(xml); //or XDocument.Load for loading from a stream
    var sum = doc.Root.Elements("DetailedUtility").Select(element => new
    {
        Id = element.Attribute("UtilityId"),
        Population = element.Elements("City").Sum(e => int.Parse(e.Attribute("Population").Value))
    });
票数 1
EN

Stack Overflow用户

发布于 2014-01-09 13:01:55

我测试过这段代码。效果很好。如果你面临任何问题,请告诉我。

XmlReader reader = XmlReader.Create("D:\population.xml");List Utility_id = new List();List population = new List();int i=0;而(reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (reader.Name == "DetailedUtility") { Utility_id.Add(reader.GetAttribute(0));population.Add(0);i++;} if (reader.Name == "City") {Popationi-1 += Convert.ToInt32(reader.GetAttribute(1));}} for (i = 0;i< Utility_id.Count;i++) {Console.WriteLine(“实用程序ID =”+ Utility_idi +“t居群=”+人口i);} Console.ReadLine();

你好,Prajul G

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21018581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档