Как разобрать XML файлы?

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

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

Ответ 14

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