Как анализировать файлы XML?

Есть ли простой метод синтаксического анализа файлов XML в C#? Если так, то?

вы можете использовать эту реализацию: stackoverflow.com/a/34813985/5784646

Eulogy 19.01.2016 15:59

Хорошо, я снова открыл это. Дубликат был решением XML Reader, поскольку речь шла о синтаксическом анализе файлов XML. возможный дубликат можно увидеть в вопросах истории редактировать ps @GeorgeStocker

Jeremy Thompson 24.11.2016 13:46

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

George Stocker 24.11.2016 21:49

@GeorgeStocker, вопросы достаточно разные, чтобы сосуществовать, и оба имеют ответы здорово, плюс принятые используют разные технологии. Вот почему я проголосовал за то, чтобы оставить это открытым, я знаю, что это принято только по ссылке, но это MSDN и было написано в то время, когда это было неприемлемо, надеюсь, побочный эффект повторного открытия немного подбодрит Джона, прочитай его профиль. В любом случае ура.

Jeremy Thompson 25.11.2016 02:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
492
4
416 170
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Ответ принят как подходящий

Я бы использовал LINQ to XML, если вы используете .NET 3.5 или выше.

Я попытался использовать это, но не смог понять, как получить что-то столь же простое, как значение идентификатора определенного элемента в моем XML (или как получить элемент по идентификатору, если на то пошло). Напротив, с помощью XmlDocument я смог сделать это с минимальными усилиями.

Kira Resari 21.07.2020 18:53

Я не уверен, существует ли «лучшая практика для синтаксического анализа XML». Существует множество технологий, подходящих для разных ситуаций. Какой способ использовать, зависит от конкретного сценария.

Вы можете использовать LINQ to XML, XmlReader, XPathNavigator или даже регулярные выражения. Если вы уточните свои потребности, я могу попытаться дать несколько предложений.

регулярное выражение для xml. ты монстр.

will 20.10.2017 12:14

Используйте XmlTextReader, XmlReader, XmlNodeReader и пространство имен System.Xml.XPath. И (XPathNavigator, XPathDocument, XPathExpression, XPathnodeIterator).

Обычно XPath упрощает чтение XML, что вы, возможно, и ищете.

К вашему сведению, вы не должны использовать new XmlTextReader() или new XmlTextWriter(). Они устарели с .NET 2.0. Вместо этого используйте XmlReader.Create() или XmlWriter.Create().

John Saunders 21.06.2015 09:22

Если вы используете .NET 2.0, попробуйте XmlReader и его подклассы XmlTextReader и XmlValidatingReader. Они обеспечивают быстрый и легкий (использование памяти и т. д.) Способ анализа XML-файла только вперед.

Если вам нужны возможности XPath, попробуйте XPathNavigator. Если вам нужен весь документ в памяти, попробуйте XmlDocument.

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

Вот некоторые примеры:

XmlDocument xmlDoc= new XmlDocument(); // Create an XML document object
xmlDoc.Load("yourXMLFile.xml"); // Load the XML document from the specified file

// Get elements
XmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress");
XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge"); 
XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone");

// Display the results
Console.WriteLine("Address: " + girlAddress[0].InnerText);
Console.WriteLine("Age: " + girlAge[0].InnerText);
Console.WriteLine("Phone Number: " + girlCellPhoneNumber[0].InnerText);

Кроме того, есть несколько другие методы, с которыми можно поработать. Например, здесь. И я думаю, что нет лучшего способа сделать это; всегда нужно выбирать самому, что больше всего подходит именно вам.

+1 за упоминание XmlDocument, что в некоторых случаях намного удобнее, чем интерфейсы сериализации. Если вам нужен один конкретный элемент, вы можете получить доступ к дочерним элементам с помощью индексатора: xmlDoc ["Root"], и их можно связать в цепочку: xmlDoc ["Root"] ["Folder"] ["Item"], чтобы откопать иерархия (хотя разумно проверить, что эти элементы действительно существуют)

Jason Williams 20.03.2010 17:02

InnerText здесь получает значение этого узла, объединенное со всеми значениями дочерних узлов, верно? Кажется странным - хотеть.

Don Cheadle 02.12.2015 22:51

Программист со списком подруг? Шенаниганы!

E. van Putten 27.12.2017 15:31

@ E.vanPutten не в наши дни. Это не месть ботаников

user4052054 08.06.2018 21:59

@DonCheadle Если вы не ожидаете, что быть будет содержать какие-либо дочерние узлы, тогда InnerText просто вернет значение узла - это то, что я (и, вероятно, все остальные, читающие этот вопрос), анализирую XML, чтобы найти в первую очередь.

F1Krazy 17.10.2019 12:19

Я думаю, это должен быть принятый ответ. XmlDocument намного удобнее использовать в «простых» ситуациях.

Kira Resari 21.07.2020 18:54

Используйте хороший Схема XSD для создания набора классов с xsd.exe и используйте XmlSerializer для создания дерева объектов из вашего XML и наоборот. Если у вас есть несколько ограничений для вашей модели, вы можете даже попытаться создать прямое сопоставление между вашими классами модели и XML с помощью атрибутов Xml *.

На MSDN есть вводная статья о сериализации XML.

Совет по производительности: создание XmlSerializer - дорогое удовольствие. Сохраните ссылку на свой экземпляр XmlSerializer, если вы собираетесь анализировать / записывать несколько файлов XML.

Хорошим примером является «Пример заказа на поставку» в середине этого примера от Microsoft. msdn.microsoft.com/en-us/library/58a18dwa.aspx. Вам не нужно создавать схему - ваш класс C# - это схема, украшенная атрибутами C#.

Mark Lakata 18.04.2013 00:50

Если вы обрабатываете большой объем данных (много мегабайт), вам нужно использовать XmlReader для потокового анализа XML.

Все остальное (XPathNavigator, XElement, XmlDocument и даже XmlSerializer, если вы сохраните полностью сгенерированный граф объекта) приведет к высокое использование памяти, а также к очень медленному времени загрузки.

Конечно, если вам все равно нужны все данные в памяти, у вас может не быть особого выбора.

Вы можете использовать ExtendedXmlSerializer для сериализации и десериализации.

Установка Вы можете установить ExtendedXmlSerializer из Nuget или выполнить следующую команду:

Install-Package ExtendedXmlSerializer

Сериализация:

ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj);

Десериализация

var obj2 = serializer.Deserialize<Message>(xml);

Стандартный XML-сериализатор в .NET очень ограничен.

  • Не поддерживает сериализацию класса с циклической ссылкой или класса со свойством интерфейса,
  • Не поддерживает словари,
  • Нет механизма для чтения старой версии XML,
  • Если вы хотите создать собственный сериализатор, ваш класс должен быть унаследован от IXmlSerializable. Это означает, что ваш класс не будет классом POCO,
  • Не поддерживает IoC.

ExtendedXmlSerializer может это и многое другое.

ExtendedXmlSerializer поддерживает .NET 4.5 или выше и .NET Core. Вы можете интегрировать его с WebApi и AspCore.

Вы можете проанализировать XML, используя эту библиотеку System.Xml.Linq. Ниже приведен пример кода, который я использовал для анализа XML-файла.

public CatSubCatList GenerateCategoryListFromProductFeedXML()
{
    string path = System.Web.HttpContext.Current.Server.MapPath(_xmlFilePath);

    XDocument xDoc = XDocument.Load(path);

    XElement xElement = XElement.Parse(xDoc.ToString());


    List<Category> lstCategory = xElement.Elements("Product").Select(d => new Category
    {
        Code = Convert.ToString(d.Element("CategoryCode").Value),
        CategoryPath = d.Element("CategoryPath").Value,
        Name = GetCateOrSubCategory(d.Element("CategoryPath").Value, 0), // Category
        SubCategoryName = GetCateOrSubCategory(d.Element("CategoryPath").Value, 1) // Sub Category
    }).GroupBy(x => new { x.Code, x.SubCategoryName }).Select(x => x.First()).ToList();

    CatSubCatList catSubCatList = GetFinalCategoryListFromXML(lstCategory);

    return catSubCatList;
}

Кроме того, вы можете использовать селектор XPath следующим образом (простой способ выбрать определенные узлы):

XmlDocument doc = new XmlDocument();
doc.Load("test.xml");

var found = doc.DocumentElement.SelectNodes("//book[@title='Barry Poter']"); // select all Book elements in whole dom, with attribute title with value 'Barry Poter'

// Retrieve your data here or change XML here:
foreach (XmlNode book in nodeList)
{
  book.InnerText = "The story began as it was...";
}

Console.WriteLine("Display XML:");
doc.Save(Console.Out);

документация

Вы можете использовать XmlDocument, а для манипулирования или извлечения данных из атрибутов вы можете Linq to XML-классы.

Совсем недавно меня попросили поработать над приложением, которое включало синтаксический анализ XML-документа, и я согласен с Джоном Галлоуэем в том, что подход, основанный на LINQ to XML, на мой взгляд, лучший. Однако мне пришлось немного покопаться, чтобы найти полезные примеры, поэтому, без лишних слов, вот несколько!

Любые комментарии приветствуются, поскольку этот код работает, но может быть не идеальным, и я хотел бы узнать больше о синтаксическом анализе XML для этого проекта!

public void ParseXML(string filePath)  
{  
    // create document instance using XML file path
    XDocument doc = XDocument.Load(filePath);

    // get the namespace to that within of the XML (xmlns = "...")
    XElement root = doc.Root;
    XNamespace ns = root.GetDefaultNamespace();

    // obtain a list of elements with specific tag
    IEnumerable<XElement> elements = from c in doc.Descendants(ns + "exampleTagName") select c;

    // obtain a single element with specific tag (first instance), useful if only expecting one instance of the tag in the target doc
    XElement element = (from c in doc.Descendants(ns + "exampleTagName" select c).First();

    // obtain an element from within an element, same as from doc
    XElement embeddedElement = (from c in element.Descendants(ns + "exampleEmbeddedTagName" select c).First();

    // obtain an attribute from an element
    XAttribute attribute = element.Attribute("exampleAttributeName");
}

С помощью этих функций я мог без проблем анализировать любой элемент и любой атрибут из XML-файла!

Другие вопросы по теме