Основные конструкции XML - элементы XML, теги, атрибуты, процессинговые инструкции, секции CDATA, комментарии. Основные конструкции XML — элементы XML, теги, атрибуты, процессинговые инструкции, секции CDATA, комментарии

24.06.2019

Представляем вашему вниманию новый курс от команды The Codeby - "Тестирование Веб-Приложений на проникновение с нуля". Общая теория, подготовка рабочего окружения, пассивный фаззинг и фингерпринт, Активный фаззинг, Уязвимости, Пост-эксплуатация, Инструментальные средства, Social Engeneering и многое другое.


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

В прошлой статье Вы узнали, как работать с элементами и узлами XML файла. В этой статье Вы узнаете, что такое атрибуты, а так же разберем основные операции с ними, такие как создание, изменение, удаление и добавление атрибута, используя язык c#.

Как упоминалось ранее, в предыдущих статьях, элементы XML файла могут иметь любое количество, неповторяющихся атрибутов, в которых Вы можете хранить различную информацию. То есть у одного элемента не может быть, к примеру, два атрибута “id”, но может быть сразу несколько атрибутов: “id”, “name”, “code” и так далее. Ещё стоит запомнить, что атрибуты xml файла заключаются в двойные кавычки.

Элемент car, содержит 1 атрибут id, который имеет значение 1.

Элемент car, содержит 2 атрибута: id и code.

Неправильно, используется повторяющийся атрибут.

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

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

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

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

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

Как создать атрибут 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-значение.

Class Program { static string fileName = @"C:\atr\1.xml"; static SortedList sortlist; sortlist = new SortedList(); 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\1.xml"; static void Main(string args) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); //Если данного атрибута id нет, то он будет создан xmlDoc.DocumentElement["garage"].SetAttribute("id", "5"); xmlDoc.Save(fileName); } }

Ещё один способ работы с атрибутами, это работа с классом . В нашем примере, мы сначала получаем все атрибуты элемента 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); } }

результат

В следующем примере, показано, как можно присвоить одно и тоже значение всем атрибутам одного элемента. Сначала так же получим все атрибуты, затем при помощи метода 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); } }

результат

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

В качестве примера создадим массив, пусть он содержит два числа, каждое число — это новое значение для атрибута: “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 файле

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

Чтобы удалить атрибут , нужно выполнить метод 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); } }

результат

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

Если нужно удалить сразу оба атрибута “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); } }

результат

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

Как получить значение атрибута 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(); } //Сохранение не требуется }

Результат:

Как изменить значение атрибута 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.InnerText = newValue.ToString(); } //Сохраняем изменения xmlDoc.Save(fileName); } }

* У коллекции Attributes в скобках можно указать, как имя атрибута Attributes[«id»] так и index Attributes

XML элементы могут иметь атрибуты, так же, как HTML.

Атрибуты предназначены для содержат данные, относящиеся к конкретному элементу.

XML-атрибуты должны быть заключены в кавычки

Значения атрибутов всегда должны быть заключены в кавычки. Либо одинарные или двойные кавычки могут быть использованы.

Для пола человека, то Элемент может быть записан следующим образом:

или как это:

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

или вы можете использовать символьные сущности:

XML Элементы против атрибутов

Посмотрите на эти примеры:

Anna
Smith


female
Anna
Smith

В первом примере пола является атрибутом. В последнем, пол является элементом. Оба примера дают ту же информацию.

Там нет никаких правил о том, когда использовать атрибуты или когда использовать элементы в XML.

Мой любимый способ

Следующие три XML-документы содержат точно такую ​​же информацию:

Атрибут дата используется в первом примере:


Tove
Jani

элемент используется во втором примере:


2008-01-10
Tove
Jani

Развернутое элемент используется в третьем примере: (THIS IS MY FAVORITE) :



2008
01
10

Tove
Jani

Избегайте XML-атрибутов?

Некоторые вещи, чтобы учитывать при использовании атрибуты:

  • атрибуты не могут содержать несколько значений (elements can)
  • атрибуты не могут содержать древовидные структуры (elements can)
  • атрибуты не легко расширяемой (for future changes)

Не в конечном итоге, как это:

to="Tove" from="Jani" heading="Reminder"
body="Don"t forget me this weekend!">

XML-атрибуты для метаданных



Tove
Jani
Reminder
Don"t forget me this weekend!


Jani
Tove
Re: Reminder
I will not

id атрибутов выше для идентификации различных нот. Это не является частью самой ноты.

То, что я пытаюсь сказать здесь, что метаданные (data about data) должны быть сохранены в качестве атрибутов, а сами данные должны быть сохранены в качестве элементов.

Элементы и атрибуты в XML Схеме

Помимо богатых возможностей для определения типов данных XML Schema включает богатый словарь для определения структуры документа и разрешенных элементов и атрибутов.

– Простое содержимое. Элемент содержит только текст (хотя, как говорилось в предыдущем параграфе, текст можно ограничить данными отдельного типа, такими как дата или числовое значение). Содержимое этого типа определяет­ся при помощи элемента simpleContent.

– Толькоэлементы. Элемент содержит только вложенные элементы. Содержи­мое этого типа определяется при помощи элемента complexType.

– Смешанноесодержимое. Элемент может содержать и текстовое содержимое, и вложенные элементы. XML Schema требует, чтобы последовательность элементов и текстового со­дер­жимого была строго определена, и допустимые документы должны соот­ветствовать этой последовательности.

– Пустоесодержимое. Элемент содержит только атрибуты, и никакого тексто­вого содержимого. XML Schema интерпретирует такие элементы как особый случай содержимого типа «только элементы» без объявленных элементов.

– Любоесодержимое. Элемент может быть пустым, содержать вложенные эле­менты и/или текст. Содержимое этого типа определяется при помощи эле­мента anyТуре.

Эти базовые типы элементов могут задаваться в объявлениях элементов схемы. Кроме того, можно указать, что элемент может встречаться в документе несколько раз, и задать минимальное и максимальное количество вхождений. Подобно SQL, XML Schema поддерживает значение элементов NULL, указывающее, что содержи­мое элемента неизвестно. В терминологии XML это значение называется nil, но смысл его тот же самый. Поддержка этого значения упрощает перенос данных ме­жду XML и столбцами баз данных, которые могут содержать значения NULL.

Схема XML позволяет определить логическую группу элементов, которые, как правило, используются совместно, и задать для этой группы собственное имя. Данную группу можно включать в последующие объявления элементов как еди­ное целое. Группировка элементов делает их структуру еще более гибкой. Группа может определять последовательность элементов, которые должны обязательно присутствовать в документе в заданном порядке. Или же она может определять набор элементов, из которого в документе обязательно должен присутствовать только один элемент.

Аналогичные возможности имеются и для управления атрибутами. Отдельный атрибут можно определить как обязательный или необязательный. Можно за­дать значение атрибута по умолчанию, которое будет использоваться в том случае, если значение этого атрибута не задано. Можно задать фиксированное значение атрибута, то есть неизменное значение для этого атрибута. Можно определить имя группы атрибутов, которые всегда используются вместе, после этого для оп­ределения группы атрибутов для очередного элемента схемы достаточно задать только имя этой группы.

Эта глава описывает о атрибутах XML. Атрибуты часть элементов XML. Элемент может иметь множественные уникально атрибуты. Атрибут дает больше информации о элементах XML. Для того чтобы быть точне, они определяют свойства элементов. Атрибут XML всегда пара им-значения .

Синтаксис

Атрибут XML имеет следующий синтаксис:

....content.. < /element-name>

где attribute1 и attribute2 имеют следующее сформировать:

Name = "value"

значение должно находиться в двойном ("") или определиться ("") цитаты. Здесь, attribute1 и attribute2 уникально ярлыки атрибута.

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

]>

Атрибуты использованы для того чтобы различить среди элементов такого же имени. Когда вы не хотите создать новый элемент для каждой ситуации. Следовательно, польза атрибута может добавить немного больше детали в дифференцировать два или больше подобные элементы.

В вышеуказанном примере, мы классифицировали заводы путем включать категорию атрибута и задавать различные значения к каждому из элементов. Следовательно мы имеем 2 категории заводов , одна цветет и другой цвет . Следовательно мы имеем 2 элемента завода с различными атрибутами.

Вы можете также наблюдать что мы объявляли этот атрибут в начале XML.

Типы атрибута

Следовать таблица перечисляет тип атрибутов:

Тип атрибута Описание
StringType

Оно принимает любую буквальную строку как значение. CDATA StringType. CDATA данные по характера. Эт середины, любая строка характеров non-повышения цены законная часть атрибута.

TokenizedType

Это больше ограниченный тип. Ограничения по ценности замеченные в грамматике прикладной после того как атрибут со значением normalized. Атрибуты TokenizedType даются как:

    Удостоверение личности: Оно использован для того чтобы определить элемент как уникально.

    IDREF: Использовано для того чтобы снабдить ссылками удостоверение личности которое было названо для другого элемента.

    IDREFS: Оно использован для того чтобы снабдить ссылками все IDs элемента.

    ENTITY: Она показывает что атрибут представит внешнюю реальность в документе.

    ENTITIES: Она показывает что атрибут представит внешние реальности в документе.

    NMTOKEN:

    NMTOKENS: Оно подобен к CDATA с ограничениями на какие данные могут быть частью атрибута.

ПеречисленныйTип

Это имеет список предопределенных значений в своем объявлении. из что, оно должно задать одно значение. 2 типа перечисленного атрибута:

    Тип примечания: Оно объявляет что элемент будет снабжен ссылками к НОТАЦИИ объявленной где-то еще в документе XML.

    Обозначение: Обозначение позволяет вам определить специфический список значений которым атрибут со значением должен соответствовать.

Правила атрибута элемента

Следование правила которым нужно быть следовать для атрибутов:

    Имя атрибута не должно появляться больше чем раз в такую же бирку старт-бирки или пуст-элемента.

    Атрибут необходимо объявить в определении типа документа (DTD) используя объявление Атрибут-Списка.

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

    Текст замены любой реальности сослался к сразу или косвенно в атрибуте со значением содержать также чем знак <

Как и в HTML, XML элементы могут иметь атрибуты. При этом значение атрибутов в XML и правило их создания во многом похожи на .

Атрибуты предоставляют дополнительную информацию об элементе.

XML атрибуты

В HTML атрибуты предоставляют некоторую дополнительную информацию об элементе:

Атрибуты часто предоставляют информацию, не являющуюся частью данных. В примере ниже тип файла не зависит от данных, но эта информация может быть важна для приложений, которые будут манипулировать этим элементом:

computer.gif

XML атрибуты должны заключаться в кавычки

Значение атрибута всегда должно заключаться в кавычки. Это могут быть либо двойные, либо одинарные кавычки. Например, пол персонажа можно записать так:

либо так:

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

либо использовать символы сущностей:

XML элементы или атрибуты

Посмотрите на следующие примеры:

Пример №1

Anna Smith

Пример №2

female Anna Smith

В первом примере пол указан в атрибуте. Во втором, пол записан, как элемент. Оба примера предоставляют одну и ту же информацию.

Нет правил, регулирующих то, когда использовать атрибуты, а когда элементы. Атрибуты широко используются в HTML. В XML, на мой взгляд, лучше их избегать, и вместо них использовать элементы.

Что лучше?

Следующие три XML документа содержат совершенно одинаковую информацию:

Дата записана, как атрибут :

Tove Jani Напоминание

Дата записана, как элемент :

10/01/2008 Tove Jani Напоминание Не забудь обо мне в эти выходные!

Дата записана, как расширенный элемент (На мой взгляд наилучший вариант):

10 01 2008 Tove Jani Напоминание Не забудь обо мне в эти выходные!

Избегать XML атрибуты?

При использовании атрибутов возникают некоторые проблемы:

  • атрибуты не могут содержать множественные значения (элементы могут)
  • атрибуты не могут содержать древовидные структуры (элементы могут)
  • атрибуты сложно расширять (для будущих изменений)

Никогда не используйте следующие конструкции:

XML атрибуты для метаданных

Иногда элементам присваивают идентификаторы. Эти идентификаторы используются для идентификации XML элементов в точности также, как идентификационные атрибуты в HTML. Следующий пример демонстрирует это:

Tove Jani Напоминание Не забудь обо мне в эти выходные! Jani Tove Re: Напоминание Не забуду

В приведенном примере атрибут id используется для идентификации разных заметок. Эта информация не является частью самой заметки.

Главная мысль всего сказанного это то, что метаданные (данные о данных) следует записывать, как атрибуты, а сами данные, как элементы.

Похожие статьи