Как работать с XML в C#

Как лучше всего работать с XML-документами, XSD 9X_dotnet и т. д. в C# 2.0?

Какие классы использовать 9X_dot-net и т. д. Каковы лучшие практики синтаксического 9X_.net анализа и создания XML-документов и т. д.

РЕДАКТИРОВАТЬ: предложения 9X_dot-net .Net 3.5 также приветствуются.

90
1

  • Игнорируйте это тем, кто также пытается найти более работоспособное решение. Это старая библиотека .NET. Вместо этого используйте XDocument, и вы сэкономите ...
9
Общее количество ответов: 9

Ответ #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

187
2

  • Исправление; нет 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.

32
0

Ответ #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 нужен.

12
1

  • Обратите внимание, что существует метод расширения [`XPathNavigator CreateNavigator (этот узел XNode)`] (http://msdn.microsoft.com/en-u ...

Ответ #4

Ответ на вопрос: Как работать с XML в C#

Прежде всего, познакомьтесь с новыми классами 9X_csharp XDocument и XElement, поскольку они являются улучшением по 9X_visual-c# сравнению с предыдущим семейством XmlDocument.

  1. Они работают с LINQ.
  2. Они быстрее и легче.

Однако вам, возможно, придется 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
0

Ответ #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.

3
0

Ответ #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, и он бесплатный!

2
0

Ответ #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

2
0

Ответ #8

Ответ на вопрос: Как работать с XML в C#

Если вы создаете типизированный набор данных 9X_c#-language в конструкторе, вы автоматически получаете 9X_.net-framework xsd, строго типизированный объект, и можете 9X_csharp загружать и сохранять xml с помощью одной 9X_.cs-file строчки кода.

1
0

Ответ #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, на который имеется ссылка.

1
0