#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.