Атрибуты XML файла

Атрибуты 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" /> 

Неправильно, используется повторяющийся атрибут &#171;id&#187;.

Если Вы не знакомы с языком XML или не знаете, что такое xml dom, то советую прочитать статью:основы xml.

Переходим к практике.

Для начала потребуется создать пустой XML файл, содержащий один root элемент <autopark>.

В результате должно получиться вот так

XML файл

Теперь рассмотрим базовые операции с атрибутами.

Как создать атрибут XML файла

Для того чтобы создать новый атрибут можно воспользоваться методом SetAttribute класса System.Xml.XmlElement, который позволяет создавать и изменять атрибуты элементов.

В первом примере создадим элемент “garage” с атрибутом “id”, которому присвоим значение 3.

class Program
{
static string fileName = @"C:\atr\1.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\1.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 файл

Как изменить значение атрибута XML файла

Чтобы изменить значения атрибута элемента можно воспользоваться методом SetAttribute, который мы использовали ранее, для создания атрибута.

class Program
{
static string fileName = @"C:\atr\1.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\1.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);
}
}

результат

как изменить атрибут у элемента XML файла

В следующем примере, показано, как можно присвоить одно и тоже значение всем атрибутам одного элемента. Сначала так же получим все атрибуты, затем при помощи метода Item(i) можно перемещаться по атрибутам, используя индекс, как в обычном массиве.

class Program
{
static string fileName = @"C:\atr\1.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);
}
}

результат

новое значение атрибута XML файла

Если же надо присвоить каждому атрибуту разные значения, то можно сделать так.

В качестве примера создадим массив, пусть он содержит два числа, каждое число &#8212; это новое значение для атрибута: “id” и “count” элемента “garage”.

class Program
{
static string fileName = @"C:\atr\1.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 файле

Создавать и изменить атрибуты научились. Если вам были не понятны, какие-то строки кода, то можете прочитать статью: работа с элементами Xml файла, где всё подробно описано.

Чтобы удалить атрибут, нужно выполнить метод RemoveAt, в качестве параметра передаем индекс удаляемого атрибута.

class Program
{
 static string fileName = @"C:\atr\1.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);
}
}

результат

удаление атрибута у элемента XML файла

Как удалить несколько атрибутов

Если нужно удалить сразу оба атрибута “id” и “count” или ещё большее количество, то для такого случая подойдет метод RemoveAll.

class Program
{
static string fileName = @"C:\atr\1.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\1.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

InsertBefore

InsertAfter

1

Добавление в коллекцию
XmlAttributeCollection

Добавляем новый атрибут в XML элемент

Как получить значение атрибута 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 у каждого узла &#171;car&#187; на определённое значение.

Решение:

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[&#171;id&#187;] так и index Attributes[0]

Результат:

как изменить значение атрибута xml файла

Читайте также:

8 комментариев

  1. юлия says:

    Добрый день! Скажите, а возможно ли значения определенного атрибута увеличить на одинаковое число, скажем имеется множество данных от 1 до 200, а нужно получить от 901 до 1100, т.е. увеличить все значения на 900? Заранее благодарю!

  2. Да, можно. Пример добавил в конец статьи, так же добавил ответ, как получить все значения атрибута id, например, у всех узлов car.

  3. Гость says:

    Отлично написано, спасибо за статью =)

  4. Korwin says:

    Здравствуйте.
    Никак не могу понять &#8212; как добавить еще один узел в один из дочерних узлов (в созданном ранее xml)

    Например добавить UAZ внутрь узла Vaz:

    <garage>
    <models>
    <car id="1">Vaz</car>
    <car id="2">UAZ</car>
    </model>
    </garage>
  5. Korwin says:

    Разобрался

    fs = new FileStream(filepath, FileMode.Open);
    write_xml.Load(fs);
    XmlNodeList ConnectionsList = write_xml.GetElementsByTagName("models");
    foreach (XmlNode List in ConnectionsList)
    {
    if(List. )
    XmlNode SetConnect = write_xml.CreateElement("car");
    XmlAttribute ConnectAttribute = write_xml.CreateAttribute("id");
    ConnectAttribute.Value = "2";
    SetConnect.Attributes.Append(ConnectAttribute);
    Name.AppendChild(write_xml.CreateTextNode("UAZ"));
    List.AppendChild(SetConnect);
    }
    fs.Close();
    write_xml.Save(filepath);
  6. Здравствуйте!

    Если ещё актуально, и я правильно понял суть задачи, то могу предложить вот такое решение:

    XmlDocument xDoc = new XmlDocument();
    xDoc.Load("путь к xml файлу");
    //находим models
    XmlNode models = xDoc.DocumentElement.FirstChild;
    //Создаём новый элемент car
    XmlElement elmCar = xDoc.CreateElement("car");
    //добавляем атрибут
    elmCar.SetAttribute("id", "2");
    //добавляем текст
    elmCar.InnerText = "UAZ";
    //добавляем дочерний элемент
    models.AppendChild(elmCar);
    xDoc.Save(filepath);

    Создает конструкцию:

    <garage>
    <models>
    <car id="1">VAZ</car>
    <car id="2">UAZ</car>
    </models>
    </garage>
  7. Сергей says:

    Здравствуйте!
    Никак не получается преобразовать XML документ в TreeView с возможностью редактировать аттрибуты узлов .. Может Вы что подскажете?

  8. Привет!

    Работа с TreeView: TreeView

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*