Как работать с XML в C#
Как лучше всего работать с XML-документами, XSD 9X_dotnet и т. д. в C# 2.0?
Какие классы использовать 9X_dot-net и т. д. Каковы лучшие практики синтаксического 9X_.net анализа и создания XML-документов и т. д.
РЕДАКТИРОВАТЬ: предложения 9X_dot-net .Net 3.5 также приветствуются.
- Игнорируйте это тем, кто также пытается найти более работоспособное решение. Это старая библиотека .NET. Вместо этого используйте XDocument, и вы сэкономите ...
Ответ #1
Ответ на вопрос: Как работать с XML в C#
Основные средства чтения и записи в C# 2.0 9X_.cs-file выполняются с помощью класса XmlDocument. Вы можете 9X_.net-framework загрузить большую часть своих настроек прямо 9X_c#.net в XmlDocument через XmlReader, который он 9X_xml принимает.
Загрузка XML напрямую
XmlDocument document = new XmlDocument(); document.LoadXml("");
Загрузка XML из файла
XmlDocument document = new XmlDocument(); document.Load(@"C:\Path\To\xmldoc.xml"); // Or using an XmlReader/XmlTextReader XmlReader reader = XmlReader.Create(@"C:\Path\To\xmldoc.xml"); document.Load(reader);
Я считаю, что самый простой / быстрый 9X_dotnet способ читать XML-документ - использовать 9X_c#-language XPath.
Чтение XML-документа с использованием XPath (с использованием XmlDocument, который позволяет нам редактировать)
XmlDocument document = new XmlDocument(); document.LoadXml(""); // Select a single node XmlNode node = document.SelectSingleNode("/People/Person[@Name = 'Nick']"); // Select a list of nodes XmlNodeList nodes = document.SelectNodes("/People/Person");
Если вам нужно работать с документами 9X_xml XSD для проверки документа XML, вы можете 9X_.net-framework использовать это.
Проверка XML-документов на соответствие схемам XSD
XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidateType = ValidationType.Schema; settings.Schemas.Add("", pathToXsd); // targetNamespace, pathToXsd XmlReader reader = XmlReader.Create(pathToXml, settings); XmlDocument document = new XmlDocument(); try { document.Load(reader); } catch (XmlSchemaValidationException ex) { Trace.WriteLine(ex.Message); }
Проверка XML на соответствие XSD на каждом узле (ОБНОВЛЕНИЕ 1)
XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidateType = ValidationType.Schema; settings.Schemas.Add("", pathToXsd); // targetNamespace, pathToXsd settings.ValidationEventHandler += new ValidationEventHandler(settings_ValidationEventHandler); XmlReader reader = XmlReader.Create(pathToXml, settings); while (reader.Read()) { } private void settings_ValidationEventHandler(object sender, ValidationEventArgs args) { // e.Message, e.Severity (warning, error), e.Error // or you can access the reader if you have access to it // reader.LineNumber, reader.LinePosition.. etc }
Написание XML-документа (вручную)
XmlWriter writer = XmlWriter.Create(pathToOutput); writer.WriteStartDocument(); writer.WriteStartElement("People"); writer.WriteStartElement("Person"); writer.WriteAttributeString("Name", "Nick"); writer.WriteEndElement(); writer.WriteStartElement("Person"); writer.WriteStartAttribute("Name"); writer.WriteValue("Nick"); writer.WriteEndAttribute(); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndDocument(); writer.Flush();
(ОБНОВЛЕНИЕ 1)
В .NET 3.5 вы используете 9X_xml XDocument для выполнения аналогичных задач. Однако 9X_c#.net разница в том, что у вас есть преимущество 9X_c#.net выполнения запросов Linq для выбора точных 9X_.net-framework данных, которые вам нужны. С добавлением 9X_c#-language инициализаторов объектов вы можете создать 9X_.net запрос, который даже возвращает объекты 9X_c#-language вашего собственного определения прямо в 9X_dotnet самом запросе.
XDocument doc = XDocument.Load(pathToXml); List people = (from xnode in doc.Element("People").Elements("Person") select new Person { Name = xnode.Attribute("Name").Value }).ToList();
(ОБНОВЛЕНИЕ 2)
Хороший способ в .NET 3.5 9X_.net - использовать XDocument для создания XML, как 9X_csharp показано ниже. Это заставляет код выглядеть 9X_.net-framework по образцу, аналогичному желаемому результату.
XDocument doc = new XDocument( new XDeclaration("1.0", Encoding.UTF8.HeaderName, String.Empty), new XComment("Xml Document"), new XElement("catalog", new XElement("book", new XAttribute("id", "bk001"), new XElement("title", "Book Title") ) ) );
создает
Все 9X_dotnet остальное не работает, вы можете ознакомиться 9X_.net-framework с этой статьей MSDN, в которой есть много 9X_c#.net примеров, которые я здесь обсуждал, и многое 9X_c#.net другое. http://msdn.microsoft.com/en-us/library/aa468556.aspx
- Исправление; нет C# 3.5; вы им ...
Ответ #2
Ответ на вопрос: Как работать с XML в C#
Это зависит от размера; для XML-файлов малого 9X_.net-framework и среднего размера очевидным победителем 9X_c# является DOM, например XmlDocument (любые версии C# /. NET) или 9X_.net XDocument (.NET 3.5 / C# 3.0). Для использования 9X_dotnet xsd вы можете загрузить xml с помощью XmlReader, а 9X_xml XmlReader принимает (в Create) XmlReaderSettings. У объектов XmlReaderSettings 9X_csharp есть свойство Schemas, которое можно использовать 9X_csharp для выполнения проверки xsd (или dtd).
Для 9X_.net-framework написания xml применимо то же самое, но 9X_c# при этом следует отметить, что размещать 9X_dotnet контент с помощью LINQ-to-XML (XDocument) немного 9X_c#-language проще, чем с помощью более старого XmlDocument.
Однако 9X_c#-language для огромного xml DOM может потреблять слишком 9X_.cs-file много памяти, и в этом случае вам может 9X_dotnet потребоваться напрямую использовать XmlReader 9X_dot-net / XmlWriter.
Наконец, для управления xml 9X_visual-c# вы можете использовать XslCompiledTransform (слой xslt).
Альтернативой 9X_csharp работе с xml является работа с объектной 9X_.net-framework моделью; вы можете использовать xsd.exe для создания 9X_.net-framework классов, представляющих xsd-совместимую 9X_dotnet модель, и просто загружать xml как объекты, манипулировать 9X_visual-c# им с помощью объектно-ориентированного подхода, а 9X_.net-framework затем снова сериализовать эти объекты; вы 9X_visual-c# делаете это с помощью XmlSerializer.
Ответ #3
Ответ на вопрос: Как работать с XML в C#
Ответ nyxtom очень хорош. Я бы добавил к 9X_.cs-file нему пару вещей:
Если вам нужен доступ только 9X_xml для чтения к XML-документу, XPathDocument
является гораздо 9X_c#-language более легким объектом, чем XmlDocument
.
Обратной стороной 9X_c# использования XPathDocument
является то, что вы не можете 9X_.net-framework использовать знакомые методы SelectNodes
и SelectSingleNode
из XmlNode
. Вместо 9X_.net этого вы должны использовать инструменты, которые 9X_.net-framework предоставляет IXPathNavigable
: используйте CreateNavigator
для создания 9X_xml XPathNavigator
и используйте XPathNavigator
для создания XPathNodeIterator
для перебора 9X_c#.net списков узлов, найденных через XPath. Обычно 9X_csharp для этого требуется на несколько строк кода 9X_c#.net больше, чем для методов XmlDocument
.
Но: классы XmlDocument
и XmlNode
реализуют 9X_c#.net IXPathNavigable
, поэтому любой код, который вы пишете для 9X_c#.net использования этих методов в XPathDocument
, также будет 9X_.cs-file работать с XmlDocument
. Если вы привыкли писать против 9X_c#-language IXPathNavigable
, ваши методы могут работать против любого 9X_xml объекта. (Вот почему использование XmlNode
и XmlDocument
в 9X_xml сигнатурах методов отмечено FxCop.)
К сожалению, XDocument
и 9X_c# XElement
(а также XNode
и XObject
) не реализуют IXPathNavigable
.
Еще одна вещь, отсутствующая 9X_visual-c# в ответе nyxtom, - это XmlReader
. Обычно вы используете 9X_visual-c# XmlReader
, чтобы избежать накладных расходов на синтаксический 9X_visual-c# анализ потока XML в объектную модель, прежде 9X_csharp чем вы начнете его обрабатывать. Вместо 9X_visual-c# этого вы используете XmlReader
для обработки входного 9X_dot-net потока по одному узлу XML за раз. По сути, это 9X_.cs-file ответ .NET на SAX. Он позволяет писать очень 9X_csharp быстрый код для обработки очень больших 9X_c#.net XML-документов.
XmlReader
также предоставляет простейший 9X_.net способ обработки фрагментов XML-документа, например 9X_visual-c# поток XML-элементов без включающих элементов, который 9X_.cs-file возвращает параметр SQL Server FOR XML RAW.
Код, который 9X_dotnet вы пишете с помощью XmlReader
, обычно очень тесно 9X_.cs-file связан с форматом XML, который он читает. Использование 9X_.net XPath позволяет вашему коду быть намного, гораздо 9X_.net-framework более слабым, связанным с XML, поэтому, как 9X_dot-net правило, это правильный ответ. Но когда 9X_.net-framework вам нужно использовать XmlReader
, он вам действительно 9X_c#.net нужен.
- Обратите внимание, что существует метод расширения [`XPathNavigator CreateNavigator (этот узел XNode)`] (http://msdn.microsoft.com/en-u ...
Ответ #4
Ответ на вопрос: Как работать с XML в C#
Прежде всего, познакомьтесь с новыми классами 9X_csharp XDocument и XElement, поскольку они являются улучшением по 9X_visual-c# сравнению с предыдущим семейством XmlDocument.
- Они работают с LINQ.
- Они быстрее и легче.
Однако вам, возможно, придется 9X_.cs-file по-прежнему использовать старые классы для 9X_dotnet работы с устаревшим кодом, особенно с ранее 9X_.net-framework созданными прокси. В этом случае вам нужно 9X_visual-c# будет ознакомиться с некоторыми шаблонами 9X_.net взаимодействия между этими классами обработки 9X_xml XML.
Я думаю, что ваш вопрос довольно общий 9X_c-sharp и потребует слишком многого в одном ответе, чтобы 9X_csharp дать подробную информацию, но это первый 9X_csharp общий ответ, который я придумал, и он служит 9X_c#-language для начала.
Ответ #5
Ответ на вопрос: Как работать с XML в C#
101 образец Linq
http://msdn.microsoft.com/en-us/library/bb387098.aspx
и Примеры Linq to XML
http://msdn.microsoft.com/en-us/vbasic/bb688087.aspx
И я думаю, что Linq упрощает 9X_c#.net XML.
Ответ #6
Ответ на вопрос: Как работать с XML в C#
Если вы работаете в .NET 3.5 и не боитесь 9X_c-sharp экспериментального кода, вы можете проверить 9X_visual-c# LINQ to XSD (http://blogs.msdn.com/xmlteam/archive/2008/02/21/linq-to-xsd-alpha-0-2.aspx), который будет генерировать 9X_c-sharp классы .NET из XSD (включая встроенные правила 9X_csharp из XSD. ).
Затем он имеет возможность записывать 9X_xml-file прямо в файл и читать из файла, гарантируя, что 9X_csharp он соответствует правилам XSD.
Я определенно 9X_c# предлагаю иметь XSD для любого XML-документа, с 9X_c-sharp которым вы работаете:
- Позволяет применять правила в XML.
- Позволяет другим видеть, как XML / будет структурирован.
- Может использоваться для проверки XML.
Я считаю, что Liquid 9X_dotnet XML Studio - отличный инструмент для создания 9X_c-sharp XSD, и он бесплатный!
Ответ #7
Ответ на вопрос: Как работать с XML в C#
Написание XML с помощью класса XmlDocument
//itemValues is collection of items in Key value pair format //fileName i name of XML file which to creatd or modified with content private void WriteInXMLFile(System.Collections.Generic.Dictionary itemValues, string fileName) { string filePath = "C:\\\\tempXML\\" + fileName + ".xml"; try { if (System.IO.File.Exists(filePath)) { XmlDocument doc = new XmlDocument(); doc.Load(filePath); XmlNode rootNode = doc.SelectSingleNode("Documents"); XmlNode pageNode = doc.CreateElement("Document"); rootNode.AppendChild(pageNode); foreach (string key in itemValues.Keys) { XmlNode attrNode = doc.CreateElement(key); attrNode.InnerText = Convert.ToString(itemValues[key]); pageNode.AppendChild(attrNode); //doc.DocumentElement.AppendChild(attrNode); } doc.DocumentElement.AppendChild(pageNode); doc.Save(filePath); } else { XmlDocument doc = new XmlDocument(); using(System.IO.FileStream fs = System.IO.File.Create(filePath)) { //Do nothing } XmlNode rootNode = doc.CreateElement("Documents"); doc.AppendChild(rootNode); doc.Save(filePath); doc.Load(filePath); XmlNode pageNode = doc.CreateElement("Document"); rootNode.AppendChild(pageNode); foreach (string key in itemValues.Keys) { XmlNode attrNode = doc.CreateElement(key); attrNode.InnerText = Convert.ToString(itemValues[key]); pageNode.AppendChild(attrNode); //doc.DocumentElement.AppendChild(attrNode); } doc.DocumentElement.AppendChild(pageNode); doc.Save(filePath); } } catch (Exception ex) { } } OutPut look like below 01 121 Mr. ABC 02 122 Mr. PQR
9X_dotnet
Ответ #8
Ответ на вопрос: Как работать с XML в C#
Если вы создаете типизированный набор данных 9X_c#-language в конструкторе, вы автоматически получаете 9X_.net-framework xsd, строго типизированный объект, и можете 9X_csharp загружать и сохранять xml с помощью одной 9X_.cs-file строчки кода.
Ответ #9
Ответ на вопрос: Как работать с XML в C#
Мое личное мнение, как программиста на C#, заключается 9X_xml-file в том, что лучший способ работать с XML 9X_.net-framework на C# - это делегировать эту часть кода 9X_visual-c# проекту VB .NET. В .NET 3.5 в VB .NET есть 9X_xml-file XML-литералы, которые делают работу с XML 9X_dotnet более интуитивно понятной. См., Например, здесь:
Overview of LINQ to XML in Visual Basic
(Обязательно 9X_.net настройте страницу для отображения кода 9X_.cs-file VB, а не кода C#.)
Я бы написал остальную 9X_.cs-file часть проекта на C#, но обработал бы XML 9X_.net-framework в проекте VB, на который имеется ссылка.
-
5
-
14
-
5
-
4
-
12
-
11
-
6
-
7
-
2
-
3
-
8
-
8
-
3
-
4
-
3
-
7
-
3
-
10
-
1
-
3
-
8
-
14
-
2
-
3
-
2
-
3
-
3
-
1
-
4
-
2
-
4
-
7
-
4
-
2
-
2
-
5
-
2
-
3
-
2
-
3
-
3
-
2
-
6
-
4
-
3
-
3
-
1
-
3
-
1
-
2