#c_sharp #xml
Есть документ следующего вида:Стоит задача записывать в определенную категорию пару key-value, и также читать из определенной категории такую пару. Я запутался в бесконечных XmlDocument, XPathNavigator и прочем, помогите пожалуйста разобраться.Язык С#. value value value value value value
Ответы
Ответ 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 ListItems { 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(); } } }
Комментариев нет:
Отправить комментарий