Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

Не могу разобраться с записью и чтением XML

#c_sharp #xml


Есть документ следующего вида:

  

  
value value value
value value value
Стоит задача записывать в определенную категорию пару key-value, и также читать из определенной категории такую пару. Я запутался в бесконечных XmlDocument, XPathNavigator и прочем, помогите пожалуйста разобраться.Язык С#.


Ответы

Ответ 1



Если не хотите мучиться со всеми особенностями XML-DOM, то попробуйте использовать LiNQtoXML. Пространство имен System.Xml.Linq, Основной рабочий класс - XElement. Загрузка исходного Xml: var myDoc = XElement.Load("myFile.xml"); Также можно использовать статический метод XElement.Parse(string), если в качестве источника используется строка. Ищем нужный элемент: var element = myDoc.Descendants("elementName").FirstOrDefault(); Читаем и пишем значение элемента: var elValue = element?.Value; element.Value = "newValue";//элемент должен существовать Читаем и пишем атрибут: var attrValue = element?.Attribute("attrName")?.Value; element.Attribute("attrName").Value = "newAttrValue"; Добавим вложенный элемент c текстовым значением и атрибутом element.Add(new XElement("subElement", "value", new XAttribute("attrName","AttrValue")); Сохраним результат на диск myDoc.Save("fileName") Как видите все довольно прозрачно и понятно. XMLtoLiNQ полностью поддерживает классическую XML-DOM, но делает это изящнее чем более старый подход, реализованный в XmlDocument и сопутствующих классах. Документация по ссылкам ниже содержит примеры в достаточном количестве чтобы разобраться и ссылки на описание сопутствующих классов. Класс XDocument Класс XElement

Ответ 2



Различные способы чтения xml, а также если неизвестно количество ключей, последний указанный способ using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Xml.Linq; using System.Linq; using System.Xml.Serialization; namespace ConsoleApplication20 { [XmlRoot("Settings")] public class XmlRecordList { [XmlElement("section")] public List Items { get; set; } } public class XmlRecord { [XmlAttribute("idCat")] public string idCat { get; set; } [XmlElement("key1")] public string key1 { get; set; } [XmlElement("key2")] public string key2 { get; set; } [XmlElement("key3")] public string key3 { get; set; } } public class SomeOtherClass { public string idCat { get; set; } public string key1 { get; set; } public string key2 { get; set; } public string key3 { get; set; } } public class SomeOtherClass2 { public string idCat { get; set; } public Dictionary keys { get; set; } } class Program { static void Main(string[] args) { XmlRecordList result = null; using (StreamReader streamReader = new StreamReader("1.xml")) { var ser = new XmlSerializer(typeof(XmlRecordList)); result = (XmlRecordList)ser.Deserialize(streamReader); } using (StreamWriter streamWriter = new StreamWriter("2.xml")) { var ser = new XmlSerializer(typeof(XmlRecordList)); ser.Serialize(streamWriter, result); } //или Linq List Records = (from xmlInput in XDocument.Load("1.xml").Descendants("section") select new SomeOtherClass { idCat = xmlInput.Attribute("idCat").Value, key1 = xmlInput.Element("key1").Value, key2 = xmlInput.Element("key2").Value, key3 = xmlInput.Element("key3").Value }).ToList(); //если количество ключей неизвестно, то можно их загрузить в коллекцию следующим образом List Settings = (from xmlInput in XDocument.Load("1.xml").Descendants("section") select new SomeOtherClass2 { idCat = xmlInput.Attribute("idCat").Value, keys = xmlInput.Descendants().ToDictionary(x=>x.Name.ToString(), x=>x.Value.ToString()) }).ToList(); } } }

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

Отправить комментарий