Как получить значение атрибута узла XML в зависимости от другого значения атрибута в C#

#c# #.net #xml #dom

#c# #.net #xml #dom

Вопрос:

Вот XML:

      <MatML_Doc>
        <Material>
           <BulkDetails>
               <Name>ABS</Name>
               <Class> <Name>PLASTIC</Name></Class>
               <Subclass> <Name>ABS Polymer</Name></Subclass>
               <PropertyData property="Material_Type">
                   <Data format="string">IsotropicMaterial</Data>
               </PropertyData>
               <PropertyData property="Version">
                   <Data format="string">4.0</Data>
               </PropertyData>
               <PropertyData property="Category">
                   <Data format="string">PLASTIC</Data>
               </PropertyData>      
               <PropertyData property="CoatingsStudioMaterialName">
                 <Data format="string">ABS Plastic</Data>
               </PropertyData>
               <PropertyData property="CoatingsVisualizationColor">
                 <Data format="exponential">168, 168, 168</Data>
               </PropertyData>
               <PropertyData property="ColorID">
                 <Data format="integer">87</Data>
               </PropertyData>
           </BulkDetails>
        </Material>
   <MatML_Doc>
   
  

Я хочу получить значение свойства данных «ColorID» (мне нужно число 87), если значение узла «Name» равно ABS.
Какова обычная процедура?

Я добавляю свое решение здесь:

 private static int GetColorIdInXmlByMaterial(string material, XmlDocument doc)
 {
    XmlElement element = doc.DocumentElement;
    XmlNodeList xmlNodeList = element.SelectNodes("//BulkDetails");

    foreach(XmlNode node in xmlNodeList)
    {
        if (node["Name"].InnerText.Equals(material))
        {
            return Convert.ToInt32(node["ColorID"].InnerText);
        }
    }
    return 0;
 }
  

Комментарии:

1. Сначала получите имя, затем проверьте, является ли оно «ABS», вы можете получить идентификатор цвета.

Ответ №1:

Используйте xml linq :

 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:temptest.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            List<Material> meterials = doc.Descendants("Material").Select(x => new Material()
            {
                name = (string)x.Descendants("Name").FirstOrDefault(),
                className = (string)x.Descendants("Class").FirstOrDefault().Element("Name"),
                properties = x.Descendants("PropertyData").Select(y => new Property()
                {
                    property = (string)y.Attribute("property"),
                    format = (string)y.Element("Data").Attribute("format"),
                    value = (string)y.Element("Data")
                }).ToList()
            }).ToList();

            Dictionary<string, Material> dict = materials.GroupBy(x => x.name, y => y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

            Material lookup = dict["ABS"];
        }
    }
    public class Material
    {
        public string name { get; set; }
        public string className { get; set; }
        public List<Property> properties { get; set; }
    }
    public class Property
    {
        public string property { get; set; }
        public string format { get; set; }
        public string value { get; set; }
    }
}
  

Комментарии:

1. Спасибо за ваше предложение. В моем XML-файле более 10 тыс. строк. Я прочитал, что xml linq имеет низкую производительность при работе с большими данными. Что в этом такого? 🙂

2. Нет. Сериализация Xml имеет низкую производительность. Linq намного быстрее. Я добавил словарь в код. Linq может быть медленным при чтении из базы данных при определенных условиях и может быть медленным, если превышает объем памяти компьютера.

3. Есть ли преимущество по сравнению с моим решением? потому что мне гораздо сложнее понять решение linq

4. XmlDocument — это старая версия библиотеки Net Xml, а XDocument — новая версия библиотеки Net. XmlDocument намного сложнее и занимает больше строк кода. Я считаю, что с XmlDocument намного сложнее работать, чем с XDocument.