Основные средства чтения и записи в C# 2.0 сделаны через класс XmlDocument . Можно загрузить большинство настроек непосредственно в XmlDocument через XmlReader, который он принимает.
XmlDocument document = new XmlDocument();
document.LoadXml("<People><Person Name='Nick' /><Person Name='Joe' /></People>");
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.
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-документа, можно использовать это.
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); }
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
}
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
Это зависит от размера; для малого и среднего размера 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.
ответ 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
и XElement
(и XNode
и XObject
) не реализуют IXPathNavigable
.
Другая вещь, не существующая в ответе nyxtom, XmlReader
. Вы обычно используете XmlReader
для предотвращения издержек парсинга потока XML в объектную модель, прежде чем Вы начнете обрабатывать его. Вместо этого Вы используете XmlReader
для обработки входного потока один узел XML за один раз. Это - по существу ответ.NET на SAX. Это позволяет Вам записать очень быстрый код для обработки очень больших XML-документов.
XmlReader
также обеспечивает самый простой способ обработать фрагменты XML-документа, например, поток элементов XML без включения элемента, который возвращает опция FOR XML RAW SQL Server.
код Вы пишете, что использование XmlReader
обычно очень сильно связано с форматом XML, который это читает. Используя XPath позволяет Вашему коду быть очень, намного более слабо связанным к XML, который является, почему это обычно - правильный ответ. Но когда необходимо использовать XmlReader
, Вам действительно нужен он.
В первую очередь, узнайте новое XDocument и XElement классы, потому что они - улучшение по сравнению с предыдущей семьей XmlDocument.
Однако , Вам, вероятно, придется все еще использовать старые классы для работы с унаследованным кодом - особенно ранее сгенерированные прокси. В этом случае необходимо будет познакомиться с некоторыми шаблонами для взаимодействия между этими классами XML-обработки.
я думаю, что Ваш вопрос довольно широк, и потребовал бы, чтобы слишком много в единственном ответе сообщило подробности, но это - первый общий ответ, о котором я думал и служу запуском.
101 образец Linq
http://msdn.microsoft.com/en-us/library/bb387098.aspx
и Linq к образцам XML
http://msdn.microsoft.com/en-us/vbasic/bb688087.aspx
И я думаю, что Linq делает XML легкий.
Если Вы работаете в.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-документа, с которым Вы работаете:
, я нахожу, что Жидкий Studio XML является большим инструментом для генерации XSD, и это свободно!
При создании введенного набора данных в разработчике тогда, Вы автоматически получаете xsd, объект со строгим контролем типов, и можете загрузить и сохранить xml с одной строкой кода.
Ответ Cookey хорош..., но здесь является подробными инструкциями относительно того, как создать объект со строгим контролем типов из XSD (или XML) и сериализировать/десериализовать в нескольких строках кода:
Мое личное мнение, как программиста C #, заключается в том, что лучший способ работать с XML в C # - это делегировать эту часть кода VB. NET-проект. В .NET 3.5 в VB .NET есть XML-литералы, которые делают работу с XML более интуитивно понятной.См., Например, здесь:
Обзор LINQ to XML в Visual Basic
(Обязательно настройте страницу для отображения кода VB, а не кода C #.)
Остальную часть проекта я бы написал в C #, но обрабатывать XML в проекте VB, на который имеется ссылка.