Атрибуты XML файла
В прошлой статье Вы узнали, как работать с элементами и узлами XML файла. В этой статье Вы узнаете, что такое атрибуты, а так же разберем основные операции с ними, такие как создание, изменение, удаление и добавление атрибута, используя язык c#.
Как упоминалось ранее, в предыдущих статьях, элементы XML файла могут иметь любое количество, неповторяющихся атрибутов, в которых Вы можете хранить различную информацию. То есть у одного элемента не может быть, к примеру, два атрибута “id”, но может быть сразу несколько атрибутов: “id”, “name”, “code” и так далее. Ещё стоит запомнить, что атрибуты xml файла заключаются в двойные кавычки.
<car id="1" />
Элемент car, содержит 1 атрибут id, который имеет значение 1.
<car id="1" code="123" />
Элемент car, содержит 2 атрибута: id и code.
<car id="1" id="2" />
Неправильно, используется повторяющийся атрибут.
Если Вы не знакомы с языком XML или не знаете, что такое xml dom, то советую прочитать статью: основы xml.
Переходим к практике.
Для начала потребуется создать пустой XML файл, содержащий один root элемент <autopark>.
В результате должно получиться вот так
Теперь рассмотрим базовые операции с атрибутами.
Как создать атрибут XML файла
Для того чтобы создать новый атрибут можно воспользоваться методом SetAttribute класса System.Xml.XmlElement, который позволяет создавать и изменять атрибуты элементов.
В первом примере создадим элемент “garage” с атрибутом “id”, которому присвоим значение 3.
class Program { static string fileName = @"C:\atr.xml"; static void Main(string [] args) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); XmlElement elmGarage = xmlDoc.CreateElement("garage"); elmGarage.SetAttribute("id", "3"); xmlDoc.DocumentElement.AppendChild(elmGarage); xmlDoc.Save(fileName); } }
результат
Как создать несколько атрибутов
Если для одного элемента необходимо создать, более одного атрибута, то в предыдущем примере просто добавим следующие строки.
elmGarage.SetAttribute("id", "3"); elmGarage.SetAttribute("count", "1"); //Добавили elmGarage.SetAttribute("shortCode", "456"); //Добавили
Теперь будет создано 3 атрибута: “id”, “count”, “shortCode” и 3 значения: 3, 1, 456.
Ещё один способ.
Так как атрибуты xml элементов имеют имя и значение, то для хранения таких данных хорошо подходит SortedList <T,K> , где T-имя атрибута K-значение.
class Program { static string fileName = @"C:\atr.xml"; static SortedList<string, string> sortlist; sortlist = new SortedList<string, string>(); static void Main(string [] args) { //заполняем атрибутами и значениями sortlist.Add("id", "3"); sortlist.Add("count", "1"); sortlist.Add("shortCode", "456"); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); //Создаем новый элемент garage XmlElement elmGarage = xmlDoc.CreateElement("garage"); //Добавляем в него атрибуты и значения foreach (var item in sortlist) { elmGarage.SetAttribute(item.Key, item.Value); } //Добавляем в дерево наш новый элемент xmlDoc.DocumentElement.AppendChild(elmGarage); //Для проверки выводим кол-во созданных атрибутов Console.WriteLine("Кол-во добавленных атрибутов: {0}", elmGarage.Attributes.Count); //Сохраняемся xmlDoc.Save(fileName); } }
результат
Как изменить значение атрибута XML файла
Чтобы изменить значения атрибута элемента можно воспользоваться методом SetAttribute, который мы использовали ранее, для создания атрибута.
class Program { static string fileName = @"C:\atr.xml"; static void Main(string [] args) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); //Если данного атрибута id нет, то он будет создан xmlDoc.DocumentElement["garage"].SetAttribute("id", "5"); xmlDoc.Save(fileName); } }
Ещё один способ работы с атрибутами, это работа с классом XmlAttributeCollection. В нашем примере, мы сначала получаем все атрибуты элемента garage, после чего применяем метод GetNamedItem , который находит нужный нам атрибут. После чего с помощью свойства InnerText, изменим значение атрибута.
class Program { static string fileName = @"C:\atr.xml"; static void Main(string [] args) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); //Получаем все атрибуты элемента garage XmlAttributeCollection atrCol; atrCol = xmlDoc.DocumentElement["garage"].Attributes; //изменяем значение атрибута id atrCol.GetNamedItem("id").InnerText = "5"; xmlDoc.Save(fileName); } }
результат
В следующем примере, показано, как можно присвоить одно и тоже значение всем атрибутам одного элемента. Сначала так же получим все атрибуты, затем при помощи метода Item(i) можно перемещаться по атрибутам, используя индекс, как в обычном массиве.
class Program { static string fileName = @"C:\atr.xml"; static void Main(string [] args) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); XmlAttributeCollection atrCol = xmlDoc. DocumentElement["garage"].Attributes; for (int i = 0; i < atrCol.Count; i++) { atrCol.Item(i).InnerText = "8"; } xmlDoc.Save(fileName); } }
результат
Если же надо присвоить каждому атрибуту разные значения, то можно сделать так.
В качестве примера создадим массив, пусть он содержит два числа, каждое число — это новое значение для атрибута: “id” и “count” элемента “garage”.
class Program { static string fileName = @"C:\atr.xml"; static int [] arValues = {77, 76}; static void Main(string [] args) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); XmlAttributeCollection atrCol = xmlDoc. DocumentElement["garage"].Attributes; for (int i = 0; i < atrCol.Count; i++) { atrCol.Item(i).InnerText = arValues[i].ToString(); } xmlDoc.Save(fileName); } }
результат
Как удалить атрибут элемента в XML файле
Создавать и изменить атрибуты научились. Если вам были не понятны, какие-то строки кода, то можете прочитать статью: работа с элементами Xml файла, где всё подробно описано.
Чтобы удалить атрибут, нужно выполнить метод RemoveAt, в качестве параметра передаем индекс удаляемого атрибута.
class Program { static string fileName = @"C:\atr.xml"; static void Main(string [] args) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); //Получаем все атрибуты элемента garage XmlAttributeCollection atrCol = xmlDoc. DocumentElement["garage"].Attributes; atrCol.RemoveAt(1); xmlDoc.Save(fileName); } }
результат
Как удалить несколько атрибутов
Если нужно удалить сразу оба атрибута “id” и “count” или ещё большее количество, то для такого случая подойдет метод RemoveAll.
class Program { static string fileName = @"C:\atr.xml"; static void Main(string [] args) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); //Получаем все атрибуты элемента garage XmlAttributeCollection atrCol = xmlDoc. DocumentElement["garage"].Attributes; //удалить оба атрибута id и count atrCol.RemoveAll(); xmlDoc.Save(fileName); } }
результат
Добавление нового атрибута
В конце ещё один пример, в котором показана работа двух методов: InsertBefore и InsertAfter, которые позволяют добавить новый атрибут элементу XML файлалибо перед, каким-то уже существующим атрибутом, либо после него.
class Program { static string strFilename = @"C:\atr.xml"; static void Main(string [] args) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(strFilename); //Получаем все атрибуты элемента garage XmlAttributeCollection atrCol = xmlDoc. DocumentElement["garage"].Attributes; //Создаем новый атрибут XmlAttribute atrDate = xmlDoc.CreateAttribute("date"); atrDate.Value = DateTime.Now.ToShortDateString(); //Добавим в коллекцию новый атрибут atrCol.Append(atrDate); //Уберите комментарий возле нужного метода. //Вставить атрибут date после атрибута id //atrCol.InsertBefore(atrCol["id"], atrDate); //Вставить атрибут date перед атрибутом id //atrCol.InsertAfter(atrCol["id"], atrDate); xmlDoc.Save(strFilename); } }
результат
InsertBefore
InsertAfter
Добавление в коллекцию
Как получить значение атрибута xml файла у нескольких узлов
Дан xml файл, который содержит два узла(node) по имени car, которые в свою очередь имеют по одному атрибуту id.
Задача: получить значение атрибута id всех узлов car.
class Program { static string fileName = @" C:\example\garage.xml"; static void Main(string [] args) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); //Получаем все узлы, имеющие имя car XmlNodeList nodeList= xmlDoc.GetElementsByTagName("car"); //Выводим значения атрибута id у всех найденных узлов car foreach (XmlNode xmlnode in nodeList) { Console.WriteLine(xmlnode.Attributes["id"].InnerText); } Console.ReadLine(); } //Сохранение не требуется }
Результат:
1 200
Как изменить значение атрибута xml файла у нескольких узлов
Задача: увеличить текущее значение атрибута id у каждого узла на определённое значение.
Решение:
class Program { static string fileName = @"C:\example\garage.xml"; static void Main(string [] args) { //Значение, на которое будем увеличивать текущее значение атрибута int changeValue = 900; //временная переменная для хранения нового значения int newValue = 0; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); //Получаем все узлы, имеющие имя car XmlNodeList nodeList= xmlDoc.GetElementsByTagName("car"); foreach (XmlNode xmlnode in nodeList) { //Получаем текущее значение атрибута id //и увеличиваем его, например на 900. newValue = int.Parse(xmlnode.Attributes["id"].InnerText) + changeValue; //Заносим новое значение xmlnode.Attributes[0].InnerText = newValue.ToString(); } //Сохраняем изменения xmlDoc.Save(fileName); } }
* У коллекции Attributes в скобках можно указать, как имя атрибута Attributes[«id»] так и index Attributes[0]
Результат:
Читайте также:
Добрый день! Скажите, а возможно ли значения определенного атрибута увеличить на одинаковое число, скажем имеется множество данных от 1 до 200, а нужно получить от 901 до 1100, т.е. увеличить все значения на 900? Заранее благодарю!
Да, можно. Пример добавил в конец статьи, так же добавил ответ, как получить все значения атрибута id, например, у всех узлов car.
Отлично написано, спасибо за статью =)
Здравствуйте.
Никак не могу понять — как добавить еще один узел в один из дочерних узлов (в созданном ранее xml)
Например добавить UAZ внутрь узла Vaz:
Разобрался
Здравствуйте!
Если ещё актуально, и я правильно понял суть задачи, то могу предложить вот такое решение:
Создает конструкцию:
Здравствуйте!
Никак не получается преобразовать XML документ в TreeView с возможностью редактировать аттрибуты узлов .. Может Вы что подскажете?
Привет!
Работа с TreeView: TreeView
вопрос: а как отобразить в dataGridView множество значений атрибутов: i f, n, gmt, cur, bd, dup, c, du, a, s, zv, zp, d. Т.е. колонки бы назывались i f, n, gmt, cur, bd, dup, c, du, a, s, zv, zp, d, а значения данных атрибутов заносились в соответсвующие строчки
xml документ вида:
—
—
<ds