Как работать с 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")
                    )
              )
        );

создает



  
    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