2008-09-11 2 views
484

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

+0

Вы можете использовать эту реализацию: http://stackoverflow.com/a/34813985/5784646 – Eulogy 2016-01-19 12:59:35

+0

Хорошо, я снова открыл это. Дубликат был решением для чтения XML, поскольку это касается разбора XML-файлов. * Возможный дубликат * можно увидеть в вопросах [edit] history ps @GeorgeStocker – 2016-11-24 10:46:17

+1

@JeremyThompson Одной из причин, почему это был дубликат, является другой вопрос, который имеет гораздо лучший ответ. Самый верный ответ - простой ответ «ссылка только» не полезен. – 2016-11-24 18:49:10

ответ

5

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

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

+1

regex для xml. вы монстр. – will 2017-10-20 09:14:47

5

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

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

273

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

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

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

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

44

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

На MSDN имеется an introductory article about XML Serialisation.

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

21

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

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

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

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 Ядро. Вы можете интегрировать его с WebApi и AspCore.

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

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

the documentation

0

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

0

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

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

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

    // set the namespace to that within of the XML (xmlns="...") 
    XNamespace ns = "http://www.example.com/NameSpace"; 

    // 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-файла без проблем!

Смежные вопросы