Как разбирать XML-файлы? [закрытый]

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

12 ответов


Я хотел бы использовать LINQ to XML Если вы находитесь в .Net 3.5 или выше.


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

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

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

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


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

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

совет по улучшению производительности: строительство Ан XmlSerializer дорого. Держите ссылку на ваш XmlSerializer экземпляр, если вы собираетесь анализировать / записывать несколько XML-файлов.


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

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

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


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

обычно XPath облегчает чтение XML, что вы, возможно, ищете.


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

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


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

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


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


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

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


можно использовать 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,
  • не поддерживает МОК.

ExtendedXmlSerializer может сделать это и многое другое больше.

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


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