Как иметь дело с XML в C#

82
задан Zapnologica 12 January 2016 в 10:22
поделиться

9 ответов

Основные средства чтения и записи в C# 2.0 сделаны через класс XmlDocument . Можно загрузить большинство настроек непосредственно в XmlDocument через XmlReader, который он принимает.

Загрузка XML Непосредственно

XmlDocument document = new XmlDocument();
document.LoadXml("<People><Person Name='Nick' /><Person Name='Joe' /></People>");

Загрузка 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);

я нахожу, что самый легкий/самый быстрый способ прочитать XML-документ при помощи XPath.

Чтение XML-документа с помощью XPath (Используя XmlDocument, который позволяет нам редактировать)

XmlDocument document = new XmlDocument();
document.LoadXml("<People><Person Name='Nick' /><Person Name='Joe' /></People>");

// Select a single node
XmlNode node = document.SelectSingleNode("/People/Person[@Name = 'Nick']");

// Select a list of nodes
XmlNodeList nodes = document.SelectNodes("/People/Person");

, Если необходимо работать с документами XSD для проверки XML-документа, можно использовать это.

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, Вы используете XDocument для выполнения подобных задач. Различие однако - Вы, имеют преимущество выполнения Запросов Linq для выбора точных данных, в которых Вы нуждаетесь. С добавлением объектных инициализаторов можно создать запрос, который даже возвращает объекты собственного определения прямо в самом запросе.

    XDocument doc = XDocument.Load(pathToXml);
    List<Person> people = (from xnode in doc.Element("People").Elements("Person")
                       select new Person
                       {
                           Name = xnode.Attribute("Name").Value
                       }).ToList();

(ОБНОВЛЯЮТ 2)

А хороший путь в.NET 3.5 состоит в том, чтобы использовать XDocument для создания XML, ниже. Это заставляет код появиться в подобном шаблоне к желаемому выводу.

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")
                    )
              )
        );

создает

<!--Xml Document-->
<catalog>
  <book id="bk001">
    <title>Book Title</title>
  </book>
</catalog>

, Все остальное перестало работать, можно проверить эту статью MSDN, которая имеет много примеров, которые я обсудил здесь и т.д. http://msdn.microsoft.com/en-us/library/aa468556.aspx

175
ответ дан David Thompson 24 November 2019 в 09:04
поделиться

Это зависит от размера; для малого и среднего размера xml, DOM такой как XmlDocument (любые версии C#/.NET) или XDocument (.NET 3.5/C# 3.0) является очевидным победителем. Для использования xsd, можно загрузить xml использование XmlReader, и XmlReader принимает (к , Создают ), XmlReaderSettings. Объекты XmlReaderSettings имеют свойство Schemas , которое может использоваться для выполнения xsd (или дата) проверка.

Для записи xml, то же самое применяется, отмечая, что немного легче разметить содержание с LINQ-to-XML (XDocument), чем более старый XmlDocument.

Однако для огромного xml, DOM может громко жевать слишком много памяти, в этом случае Вы, возможно, должны были бы использовать XmlReader/XmlWriter непосредственно.

Наконец, для управления xml Вы может хотеть использовать XslCompiledTransform (xslt слой).

альтернатива работе с xml должна работать с объектной моделью; можно использовать xsd.exe для создания классов, которые представляют xsd-совместимую модель, и просто загружают xml как объекты , управляют им с OO, и затем сериализируют те объекты снова; Вы делаете это с XmlSerializer.

30
ответ дан Marc Gravell 24 November 2019 в 09:04
поделиться

ответ nyxtom очень хорош. Я добавил бы несколько вещей к нему:

, Если Вам нужен доступ только для чтения к XML-документу, XPathDocument, много объекта более легкого веса, чем XmlDocument.

оборотная сторона использования XPathDocument - то, что Вы не можете использовать знакомое SelectNodes и SelectSingleNode методы XmlNode. Вместо этого необходимо использовать инструменты, который эти IXPathNavigable обеспечивает: используйте CreateNavigator, чтобы создать XPathNavigator и использовать XPathNavigator для создания XPathNodeIterator с для итерации по спискам узлов, которые Вы находите через XPath. Это обычно требует еще нескольких строк кода, чем эти XmlDocument методы.

, Но: XmlDocument и XmlNode реализация классов IXPathNavigable, таким образом, любой код Вы пишете для использования тех методов на XPathDocument, будет также работать над XmlDocument. Если Вы привыкаете к записи против [1 117], Ваши методы могут работать против любого объекта. (Поэтому использование XmlNode и XmlDocument в сигнатурах методов отмечается FxCop.)

Печально, XDocument и XElementXNode и XObject) не реализуют IXPathNavigable.

Другая вещь, не существующая в ответе nyxtom, XmlReader. Вы обычно используете XmlReader для предотвращения издержек парсинга потока XML в объектную модель, прежде чем Вы начнете обрабатывать его. Вместо этого Вы используете XmlReader для обработки входного потока один узел XML за один раз. Это - по существу ответ.NET на SAX. Это позволяет Вам записать очень быстрый код для обработки очень больших XML-документов.

XmlReader также обеспечивает самый простой способ обработать фрагменты XML-документа, например, поток элементов XML без включения элемента, который возвращает опция FOR XML RAW SQL Server.

код Вы пишете, что использование XmlReader обычно очень сильно связано с форматом XML, который это читает. Используя XPath позволяет Вашему коду быть очень, намного более слабо связанным к XML, который является, почему это обычно - правильный ответ. Но когда необходимо использовать XmlReader, Вам действительно нужен он.

12
ответ дан Robert Rossney 24 November 2019 в 09:04
поделиться

В первую очередь, узнайте новое XDocument и XElement классы, потому что они - улучшение по сравнению с предыдущей семьей XmlDocument.

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

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

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

4
ответ дан hurst 24 November 2019 в 09:04
поделиться

101 образец Linq

http://msdn.microsoft.com/en-us/library/bb387098.aspx

и Linq к образцам XML

http://msdn.microsoft.com/en-us/vbasic/bb688087.aspx

И я думаю, что Linq делает XML легкий.

3
ответ дан emremp 24 November 2019 в 09:04
поделиться

Если Вы работаете в.NET 3.5, и Вы не боитесь экспериментального кода, можно проверить LINQ к XSD ( http://blogs.msdn.com/xmlteam/archive/2008/02/21/linq-to-xsd-alpha-0-2.aspx ), который генерирует классы.NET от XSD (включая созданный в правилах от XSD).

Это тогда имеет способность записать прямо в файл и читать из файла, гарантирующего, что это соответствует правилам XSD.

я определенно предлагаю иметь XSD для любого XML-документа, с которым Вы работаете:

  • Позволяет, Вы для осуществления правил в XML
  • Позволяете другим видеть, как XML является/, будет структурирован
  • , Может использоваться для проверки XML

, я нахожу, что Жидкий Studio XML является большим инструментом для генерации XSD, и это свободно!

2
ответ дан Aaron Powell 24 November 2019 в 09:04
поделиться

При создании введенного набора данных в разработчике тогда, Вы автоматически получаете xsd, объект со строгим контролем типов, и можете загрузить и сохранить xml с одной строкой кода.

1
ответ дан Peter C 24 November 2019 в 09:04
поделиться

Ответ Cookey хорош..., но здесь является подробными инструкциями относительно того, как создать объект со строгим контролем типов из XSD (или XML) и сериализировать/десериализовать в нескольких строках кода:

Инструкции

0
ответ дан Steve Horn 24 November 2019 в 09:04
поделиться

Мое личное мнение, как программиста C #, заключается в том, что лучший способ работать с XML в C # - это делегировать эту часть кода VB. NET-проект. В .NET 3.5 в VB .NET есть XML-литералы, которые делают работу с XML более интуитивно понятной.См., Например, здесь:

Обзор LINQ to XML в Visual Basic

(Обязательно настройте страницу для отображения кода VB, а не кода C #.)

Остальную часть проекта я бы написал в C #, но обрабатывать XML в проекте VB, на который имеется ссылка.

1
ответ дан 24 November 2019 в 09:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: