如何使用c#计算每个实用程序(XML数据)中所有城市的人口总数?

如何使用c#计算每个实用程序(XML数据)中所有城市的人口总数?,c#,xml,C#,Xml,我有以下xml文件 <?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="23

我有以下xml文件

<?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#中获得每个实用ID中所有城市人口的总和。请帮帮我

我尝试过以下代码,但没有一个对我有效

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;
                                //}

                            }
xmlDoc.LoadXml(strFetchResData);
//dynamic BillUtilityData=JsonConvert.SerializeXmlNode(xmlDoc)。替换(@“,@”)。删除(1,44);
//动态BillUtilityData=JsonConvert.DeserializeObject(JsonConvert.SerializeXmlNode(xmlDoc).Replace(@“@“,@”).Remove(1,44));
//动态BillUtilityData=JsonString;
XmlNodeList utilitylist=xmlDoc.DocumentElement.ChildNodes;
如果(utilitylist.Count>0)
{
foreach(实用程序列表中的XmlNode nodeUtil)
{
双重?总人口=0;
//Load(nodeUtil.InnerXml.ToString());
动态BillUtilityData=JsonConvert.DeserializeObject(JsonConvert.SerializeXmlNode(nodeUtil)。替换(@“@“,@”)。删除(1,44));
//totalPopulation=Convert.ToDouble((nodeUtil.LastChild.Attributes[“Population”].Value);
//LoadXml(nodeUtil.InnerText);
//foreach(nodeUtil[“城市”]中的XmlNode cityUtil)
//{
//totalPopulation=SunpowerServiceMethods.calculateTotalPopulationOfCitySiblings(cityUtil,totalPopulation);
//中断;
//}
}
编辑:因此您的XML文件声明了名称空间,您应该处理它们

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

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"))
            };
返回:

{ UtilityId = 720, TotalPopulation = 104038 }
{ UtilityId = 721, TotalPopulation = 56760 }
编辑:因此您的XML文件声明了名称空间,您应该处理它们

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

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"))
            };
返回:

{ UtilityId = 720, TotalPopulation = 104038 }
{ UtilityId = 721, TotalPopulation = 56760 }
这应该做到:

    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))
    });
这应该做到:

    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))
    });

我已经测试了这段代码。它运行良好。如果您遇到任何问题,请告诉我

XmlReader=XmlReader.Create(“D:\\population.xml”);
列表实用工具_id=新列表();
列表填充=新列表();
int i=0;
while(reader.Read())
{
if(reader.NodeType==XmlNodeType.Element)
{
if(reader.Name==“DetailedUtility”)
{
实用程序id.Add(reader.GetAttribute(0));
人口。增加(0);
i++;
}
如果(reader.Name==“城市”)
{
填充[i-1]+=Convert.ToInt32(reader.GetAttribute(1));
}
}
}
对于(i=0;i
问候,,
Prajul G

我已经测试了这段代码。它运行良好。如果您遇到任何问题,请告诉我

XmlReader=XmlReader.Create(“D:\\population.xml”);
列表实用工具_id=新列表();
列表填充=新列表();
int i=0;
while(reader.Read())
{
if(reader.NodeType==XmlNodeType.Element)
{
if(reader.Name==“DetailedUtility”)
{
实用程序id.Add(reader.GetAttribute(0));
人口。增加(0);
i++;
}
如果(reader.Name==“城市”)
{
填充[i-1]+=Convert.ToInt32(reader.GetAttribute(1));
}
}
}
对于(i=0;i
问候,,
Prajul G

XDocument.Load(路径到xml)需要URI,但我有一个xml格式的字符串。如何在xdoc变量中插入xml字符串?@SumithourAsia只需使用
XDocument.Parse
而不是
XDocument.Load
如何获取每个UtilityId的值及其总人口?foreach循环给出error@SumitChourasiaforeach应该可以工作
foreach(查询中的var项){//use item.TotalPopulation}
@sumithourasia正如我所建议的,您的真实xml中有名称空间。请下次提供真实xml以避免此类问题。我已更新代码以处理名称空间document.Load(路径\u到\u xml)需要URI,但我有一个xml格式的字符串。如何在xdoc变量中插入xml字符串?@SumithourAsia只需使用
XDocument.Parse
而不是
XDocument.Load
如何获取每个UtilityId的值及其总人口?foreach循环给出error@SumitChourasiaforeach应该可以工作
foreach(查询中的变量项){//use item.TotalPopulation}
@sumithourasia正如我所建议的,您的真实xml中有名称空间。请下次提供真实xml以避免此类问题。我已更新代码以处理名称空间当代码不工作时会发生什么?它是否编译?是否会出现运行时错误?您是否得到错误答案?当代码不工作时会发生什么?它是否会运行pile?你有运行时错误吗?你有没有得到错误的答案?