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

468

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

  • 0
    Вы могли бы использовать эту реализацию: stackoverflow.com/a/34813985/5784646
  • 0
    Хорошо, я снова открыл это. Дубликат был решением для чтения XML, где речь идет о разборе файлов XML. Возможный дубликат можно увидеть в истории изменений вопросов ps @GeorgeStocker
Показать ещё 2 комментария
Теги:

14 ответов

234
Лучший ответ

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

276

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

Вот несколько примеров:

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

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

  • 45
    +1 за упоминание XmlDocument, который в некоторых случаях намного удобнее, чем интерфейсы сериализации. Если вам нужен один конкретный элемент, вы можете получить доступ к дочерним элементам с помощью indexer: xmlDoc ["Root"], и их можно объединить в цепочку: xmlDoc ["Root"] ["Folder"] ["Item"], чтобы найти иерархия (хотя разумно подтвердить, что эти элементы действительно существуют)
  • 1
    InnerText здесь получает значение этого узла, объединенного со всеми значениями дочерних узлов - верно? Кажется странным хотеть.
Показать ещё 2 комментария
48

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

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

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

23

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

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

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

16

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

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

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

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

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

5

Мне недавно потребовалось работать над приложением, которое включало анализ 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 без проблем!

5

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

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

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

В дополнение вы можете использовать селектор 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);

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

2

Вы можете проанализировать 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;
}
0

lxml - библиотека на основе python для анализа XML для пользователей python

0

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

0

Вы можете использовать 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.

-2

вы можете попробовать использовать XDocument.Load(pathOfYourXmlFileHere)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню