Фильтровать атрибуты в Xml в c# И изменить Xml - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь преобразовать Xml A в Xml B, используя C#.

XML A

<root>  
  <country>    
    <city name="Boston" value="100">
    <city name="Boston" value="200">
   </country>
  </root>

XMl B (Ожидается)

<root>  
  <country>    
        <city name="Boston" value="300">
   </country>
  </root>

C# код:

 var doc = XDocument.Load(path);
            var myDocument = new XmlDocument();
            myDocument.Load(path);
            var nodes = myDocument.GetElementsByTagName("city");

var resultNodes = new List<XmlNode>();
            foreach (XmlNode node in nodes)
            {
                if (node.Attributes != null && node.Attributes["name"] != null && node.Attributes["name"].Value == "Boston")
                    resultNodes.Add(node);    
                foreach(var elements in resultNodes)
                {
                    elements.Attributes.RemoveNamedItem("Boston");
                }
            }

В основном то, что я хотел здесь сделать, это добавить 2 значения (100 и 200) из 2 разных атрибутов Boston из XML A и распечатать в новый файл XML B, но немного потерял здесь то, что входит в этот блок.

foreach (XmlNode i in resultNodes)
            {

            }

1 Ответ

0 голосов
/ 29 мая 2020

Проблемы, подобные этой, легко создавать новые XElements. См. Код ниже:

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            List<XElement> countries = doc.Descendants("country").ToList();
            foreach (XElement oldCountry in countries)
            {
                XElement newCountry = new XElement("country");

                var cities = oldCountry.Elements("city").GroupBy(x => (string)x.Attribute("name"));
                foreach (var city in cities)
                {
                    newCountry.Add(new XElement("city", new object[] { new XAttribute("name", city.Key), new XAttribute("value", city.Sum(x => (int)x.Attribute("value"))) }));
                }
                oldCountry.ReplaceWith(newCountry);
            }

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...