C как из xmldocument получить класс
Для работы с XML в C# можно использовать несколько подходов. В первых версиях фреймворка основной функционал работы с XML предоставляло пространство имен System.Xml . В нем определен ряд классов, которые позволяют манипулировать xml-документом:
- XmlNode : представляет узел xml. В качестве узла может использоваться весь документ, так и отдельный элемент
- XmlDocument : представляет весь xml-документ
- XmlElement : представляет отдельный элемент. Наследуется от класса XmlNode
- XmlAttribute : представляет атрибут элемента
- XmlText : представляет значение элемента в виде текста, то есть тот текст, который находится в элементе между его открывающим и закрывающим тегами
- XmlComment : представляет комментарий в xml
- XmlNodeList : используется для работы со списком узлов
Ключевым классом, который позволяет манипулировать содержимым xml, является XmlNode , поэтому рассмотрим некоторые его основные методы и свойства:
- Свойство Attributes возвращает объект XmlAttributeCollection , который представляет коллекцию атрибутов
- Свойство ChildNodes возвращает коллекцию дочерних узлов для данного узла
- Свойство HasChildNodes возвращает true , если текущий узел имеет дочерние узлы
- Свойство FirstChild возвращает первый дочерний узел
- Свойство LastChild возвращает последний дочерний узел
- Свойство InnerText возвращает текстовое значение узла
- Свойство InnerXml возвращает всю внутреннюю разметку xml узла
- Свойство Name возвращает название узла. Например, — значение свойства Name равно «user»
- Свойство ParentNode возвращает родительский узел у текущего узла
Применим эти классы и их функционал. И вначале для работы с xml создадим новый файл. Назовем его people.xml и определим в нем следующее содержание:
Microsoft 37 41
Теперь пройдемся по этому документу и выведем его данные на консоль:
using System.Xml; XmlDocument xDoc = new XmlDocument(); xDoc.Load("people.xml"); // получим корневой элемент XmlElement? xRoot = xDoc.DocumentElement; if (xRoot != null) < // обход всех узлов в корневом элементе foreach (XmlElement xnode in xRoot) < // получаем атрибут name XmlNode? attr = xnode.Attributes.GetNamedItem("name"); Console.WriteLine(attr?.Value); // обходим все дочерние узлы элемента user foreach (XmlNode childnode in xnode.ChildNodes) < // если узел - company if (childnode.Name == "company") < Console.WriteLine($"Company: "); > // если узел age if (childnode.Name == "age") < Console.WriteLine($"Age: "); > > Console.WriteLine(); > >
В итоге я получу следующий вывод на консоли:
Tom Company: Microsoft Age: 37 Bob Company: Google Age: 41
Чтобы начать работу с документом xml, нам надо создать объект XmlDocument и затем загрузить в него xml-файл: xDoc.Load(«people.xml»);
При разборе xml для начала мы получаем корневой элемент документа с помощью свойства xDoc.DocumentElement . Далее уже происходит собственно разбор узлов документа.
В цикле foreach(XmlNode xnode in xRoot) пробегаемся по всем дочерним узлам корневого элемента. Так как дочерние узлы представляют элементы , то мы можем получить их атрибуты: XmlNode attr = xnode.Attributes.GetNamedItem(«name»); и вложенные элементы: foreach(XmlNode childnode in xnode.ChildNodes)
Чтобы определить, что за узел перед нами, мы можем сравнить его название: if(childnode.Name==»company»)
Подобным образом мы можем создать объекты классов и структур по данным из xml:
using System.Xml; var people = new List(); XmlDocument xDoc = new XmlDocument(); xDoc.Load("people.xml"); // получим корневой элемент XmlElement? xRoot = xDoc.DocumentElement; if (xRoot != null) < foreach (XmlElement xnode in xRoot) < Person person = new Person(); XmlNode? attr = xnode.Attributes.GetNamedItem("name"); person.Name = attr?.Value; foreach (XmlNode childnode in xnode.ChildNodes) < if (childnode.Name == "company") person.Company = childnode.InnerText; if (childnode.Name == "age") person.Age = int.Parse(childnode.InnerText); >people.Add(person); > foreach (var person in people) Console.WriteLine($" () - "); > class Person < public string? Name < get; set; >public int Age < get; set; >public string? Company < get; set; >>
В данном случае определен класс Person с тремя свойствами. При переборе узлов файла xml значения элементов и их атрибутов передается объекту класса Person.
Консольный вывод программы:
Tom (Microsoft) - 37 Bob (Google) - 41
Parsing xml element to class
I have xml document (you may look it up here) from web request. I need to get values of ccy, base_ccy, buy and sale attributes from each «exchangerate» element:
I’ve manually created class ExchangeRate, which is looks like this:
[Serializable] public class ExchangeRate < [XmlAttribute("ccy")] public string Ccy < get; set; >[XmlAttribute("base_ccy")] public string Base_ccy < get; set; >[XmlAttribute("buy")] public string Buy < get; set; >[XmlAttribute("sale")] public string Sale < get; set; >>
and trying to deserialize xml-element «exchangerate» (which I’ve isolate from whole xml-document) to the instance of ExchangeRate class in this way:
private ExchangeRate DesereilizeXMLNode(XmlNode node)
When I debuging DesereilizeXMLNode method I receiving exception while calling deserialization method. The exception is XAMLParseException in MainWindow.xaml in first line of the Grid element (which is weird) and I think it is not a proper place for calling exception. The question is: where was I wrong? Am I wrong when tried to create an object instance from xml-element in this way? Maybe I’ve made mistake when tried to deserialize only xml-element with attributes without deserialization of whole xml-document?
C как из xmldocument получить класс
Стал на днях исследовать, почему Visual Studio при открытии зависает.
Оказалось, оно запускает новую клиентскую сессию через Business Connector, пытается запустить логику системы контроля версий, и в какой-то момент сессия молча падает на вызове XmlDocument::newXML(), после чего открывается новая сессия и дальше по кругу.
Могу вопроизвести при помощи такого скрипта на C#:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Dynamics.BusinessConnectorNet; namespace ReproXmlDocumentError < class Program < public static void createObjectInAX(string _objectName) < Axapta ax; try < ax = new Axapta(); ax.Logon(null, null, null, null); AxaptaObject o = ax.CreateAxaptaObject(_objectName); if (o != null) < Console.WriteLine( "Object was successfully created", _objectName); > > catch (Exception e) < Console.WriteLine( "Object was not created. Error: ", _objectName, e.Message); > > static void Main(string[] args) < createObjectInAX("CostSheet"); createObjectInAX("XMLDocument"); createObjectInAX("TextBuffer"); Console.ReadKey(); > > >
После запуска в Event Viewer можно найти записи, где самое конкретное: «The specified resource type cannot be found in the image file».
Пробовал запустить этот же скрипт на демо-машинах AX 2012 R3 RTM и AX 2012 R3 CU9: всё нормально, XMLDocument создается.
Если запустить аналогичный скрипт, но на X++ в клиенте — тоже без проблем.
Что бы это такое могло быть, что стандартный класс XmlDocument не работает через бизнес-коннектор?
AX 2012 R3
Kernel version: 6.3.2000.3774
Application version: 6.3.2000.323
Регистрация: 23.10.2012
Проверьте вот эту информацию:
This problem is related to the lack of memory in Windows. It may be resolved by closing unused applications and by increasing the Windows Virtual memory setting.
Для newXML:
Make sure that the user has development privileges by setting the security key to SysDevelopment on the control that calls this method.
Последний раз редактировалось Товарищ ♂uatr; 15.10.2015 в 10:52 .
Товарищ ♂uatr |
Посмотреть профиль |
Отправить личное сообщение для Товарищ ♂uatr |
Найти ещё сообщения от Товарищ ♂uatr |
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Я бы глянул Fusion лог, может какая длл не грузиться и поэтому обьект не создается.
Если длл определить удалось, глянул бы сидит ли она в GAC.
PS Не забудьте отключить .
__________________
AxAssist 2012 — Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Регистрация: 27.02.2006
Адрес: Дания
Включил Fusion лог.
*** Assembly Binder Log Entry (15-Oct-15 @ 11:09:14 AM) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Remote Debugger\x64\msvsmon.exe
— A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = Microsoft.IntelliTrace.ObjectModel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
(Fully-specified)
LOG: Appbase = file:///C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/Remote Debugger/x64/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = msvsmon.exe
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Remote Debugger\x64\msvsmon.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/Remote Debugger/x64/Microsoft.IntelliTrace.ObjectModel.DLL.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/Remote Debugger/x64/Microsoft.IntelliTrace.ObjectModel/Microsoft.IntelliTrace.ObjectModel.DLL.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/Remote Debugger/x64/Microsoft.IntelliTrace.ObjectModel.EXE.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/Remote Debugger/x64/Microsoft.IntelliTrace.ObjectModel/Microsoft.IntelliTrace.ObjectModel.EXE.
LOG: All probing URLs attempted and failed.
*** Assembly Binder Log Entry (15-Oct-15 @ 11:09:14 AM) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Remote Debugger\x64\msvsmon.exe
— A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = Microsoft.IntelliTrace.ObjectModel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
(Fully-specified)
LOG: Appbase = file:///C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/Remote Debugger/x64/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = msvsmon.exe
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Remote Debugger\x64\msvsmon.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/Remote Debugger/x64/Microsoft.IntelliTrace.ObjectModel.DLL.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/Remote Debugger/x64/Microsoft.IntelliTrace.ObjectModel/Microsoft.IntelliTrace.ObjectModel.DLL.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/Remote Debugger/x64/Microsoft.IntelliTrace.ObjectModel.EXE.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/Remote Debugger/x64/Microsoft.IntelliTrace.ObjectModel/Microsoft.IntelliTrace.ObjectModel.EXE.
LOG: All probing URLs attempted and failed.
Но тут ничего нет про XML.Сравнил что Visual Studio пишет в окне отладки:На демо машине:
‘ReproXmlDocumentError.vshost.exe’ (CLR v4.0.30319: ReproXmlDocumentError.vshost.exe): Loaded ‘C:\windows\assembly\GAC_64\Microsoft.Dynamics.AX.ManagedInterop\6.3.0.0__31bf3856ad364e35\Microsoft.Dynamics.AX.ManagedInterop.dll’. Cannot find or open the PDB file.
‘ReproXmlDocumentError.vshost.exe’ (CLR v4.0.30319: ReproXmlDocumentError.vshost.exe): Loaded ‘C:\windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.8387_none_08e793bfa83a89b5\msvcm90.dll’. Cannot find or open the PDB file.
‘ReproXmlDocumentError.vshost.exe’ (CLR v4.0.30319: ReproXmlDocumentError.vshost.exe): Loaded ‘C:\windows\assembly\GAC_64\Microsoft.Dynamics.AX.ManagedInteropCore\6.3.0.0__31bf3856ad364e35\Microsoft.Dynamics.AX.ManagedInteropCore.dll’. Cannot find or open the PDB file.
‘ReproXmlDocumentError.vshost.exe’ (CLR v4.0.30319: ReproXmlDocumentError.vshost.exe): Loaded ‘C:\windows\Microsoft.Net\assembly\GAC_64\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll’. Cannot find or open the PDB file.
‘ReproXmlDocumentError.vshost.exe’ (CLR v4.0.30319: ReproXmlDocumentError.vshost.exe): Loaded ‘C:\Program Files\Microsoft Dynamics AX\60\BusinessConnector\Bin\Microsoft.Dynamics.Xml.dll’. Cannot find or open the PDB file.
The thread 0x5c80 has exited with code 259 (0x103).
The thread 0x5c9c has exited with code 259 (0x103).
The program ‘[22640] ReproXmlDocumentError.vshost.exe’ has exited with code 0 (0x0).
The program ‘[22640] ReproXmlDocumentError.vshost.exe: Program Trace’ has exited with code 0 (0x0).
На рабочей машине, где ошибка:
‘ReproXmlDocumentError.vshost.exe’ (CLR v4.0.30319: ReproXmlDocumentError.vshost.exe): Loaded ‘C:\windows\assembly\GAC_64\Microsoft.Dynamics.AX.ManagedInterop\6.3.0.0__31bf3856ad364e35\Microsoft.Dynamics.AX.ManagedInterop.dll’. Cannot find or open the PDB file.
‘ReproXmlDocumentError.vshost.exe’ (CLR v4.0.30319: ReproXmlDocumentError.vshost.exe): Loaded ‘C:\windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.8387_none_08e793bfa83a89b5\msvcm90.dll’. Cannot find or open the PDB file.
‘ReproXmlDocumentError.vshost.exe’ (CLR v4.0.30319: ReproXmlDocumentError.vshost.exe): Loaded ‘C:\windows\assembly\GAC_64\Microsoft.Dynamics.AX.ManagedInteropCore\6.3.0.0__31bf3856ad364e35\Microsoft.Dynamics.AX.ManagedInteropCore.dll’. Cannot find or open the PDB file.
‘ReproXmlDocumentError.vshost.exe’ (CLR v4.0.30319: ReproXmlDocumentError.vshost.exe): Loaded ‘C:\windows\Microsoft.Net\assembly\GAC_64\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll’. Cannot find or open the PDB file.
A first chance exception of type ‘Microsoft.Dynamics.BusinessConnectorNet.XppException’ occurred in Microsoft.Dynamics.BusinessConnectorNet.dll
The thread 0x7ac has exited with code 259 (0x103).
The thread 0x2b24 has exited with code 259 (0x103).
The program ‘[18044] ReproXmlDocumentError.vshost.exe: Program Trace’ has exited with code 0 (0x0).
The program ‘[18044] ReproXmlDocumentError.vshost.exe’ has exited with code 0 (0x0).
Отличается всего одна линия.
Папки C:\Program Files\Microsoft Dynamics AX\60\BusinessConnector\Bin на обеих машинах идентичны.
Атрибуты XML файла
В прошлой статье Вы узнали, как работать с элементами и узлами XML файла. В этой статье Вы узнаете, что такое атрибуты, а так же разберем основные операции с ними, такие как создание, изменение, удаление и добавление атрибута, используя язык c#.
Как упоминалось ранее, в предыдущих статьях, элементы XML файла могут иметь любое количество, неповторяющихся атрибутов, в которых Вы можете хранить различную информацию. То есть у одного элемента не может быть, к примеру, два атрибута “id”, но может быть сразу несколько атрибутов: “id”, “name”, “code” и так далее. Ещё стоит запомнить, что атрибуты xml файла заключаются в двойные кавычки.
Элемент car, содержит 1 атрибут id, который имеет значение 1.
Элемент car, содержит 2 атрибута: id и code.
Неправильно, используется повторяющийся атрибут.
Если Вы не знакомы с языком XML или не знаете, что такое xml dom, то советую прочитать статью: основы xml.
Переходим к практике.
Для начала потребуется создать пустой XML файл, содержащий один root элемент .
В результате должно получиться вот так
Теперь рассмотрим базовые операции с атрибутами.
Как создать атрибут 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-значение.
class Program < static string fileName = @"C:\atr.xml"; static SortedListsortlist; 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("Кол-во добавленных атрибутов: ", 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 = ; 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); >>
Добавление в коллекцию
Как получить значение атрибута 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]
- Как найти все цифры в строке?
- Как создать веб-сервер с помощью класса HttpListener?
- Как удалить параметр реестра Windows
10 комментариев
Добрый день! Скажите, а возможно ли значения определенного атрибута увеличить на одинаковое число, скажем имеется множество данных от 1 до 200, а нужно получить от 901 до 1100, т.е. увеличить все значения на 900? Заранее благодарю!
Да, можно. Пример добавил в конец статьи, так же добавил ответ, как получить все значения атрибута id, например, у всех узлов car.
Отлично написано, спасибо за статью =)
Korwin :
Здравствуйте.
Никак не могу понять — как добавить еще один узел в один из дочерних узлов (в созданном ранее xml) Например добавить UAZ внутрь узла Vaz:
Korwin :
Разобрался
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);
Здравствуйте! Если ещё актуально, и я правильно понял суть задачи, то могу предложить вот такое решение:
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);
Создает конструкцию:
id="1">VAZ id="2">UAZ
Сергей :
Здравствуйте!
Никак не получается преобразовать XML документ в TreeView с возможностью редактировать аттрибуты узлов .. Может Вы что подскажете?
Привет! Работа с TreeView: TreeView
Andrey :
вопрос: а как отобразить в 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 документ вида: — —