Ответ 1
Я бы использовал LINQ для XML, если вы в.NET 3.5 или выше.
Есть ли простой метод анализа XML файлов на С#? Если да, то что?
Я бы использовал LINQ для 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 Schema, чтобы создать набор классов с xsd.exe и используйте XmlSerializer
, чтобы создать дерево объектов из вашего XML и наоборот. Если у вас мало ограничений на вашу модель, вы даже можете попытаться создать прямое сопоставление между вами модельными классами и XML с атрибутами Xml *.
В MSDN есть вводная статья о XML-сериализации.
Совет по производительности: Построение XmlSerializer
является дорогостоящим. Сохраните ссылку на свой экземпляр XmlSerializer
, если вы собираетесь анализировать/записывать несколько файлов XML.
Если вы обрабатываете большой объем данных (много мегабайт), вы хотите использовать XmlReader
для потоковой обработки XML файла.
Что-нибудь еще (XPathNavigator
, XElement
, XmlDocument
и даже XmlSerializer
, если вы сохраняете полный сгенерированный графический объект) приведет к использованию большой памяти, а также очень медленное время загрузки.
Конечно, если вам все же нужны все данные в памяти, у вас может не быть выбора.
Используйте XmlTextReader
, XmlReader
, XmlNodeReader
и System.Xml.XPath
пространство имен. И (XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
).
Обычно XPath
упрощает чтение XML, что вы ищите.
Если вы используете .NET 2.0, попробуйте XmlReader
и его подклассы XmlTextReader
и XmlValidatingReader
. Они обеспечивают быструю, легкую (использование памяти и т.д.), Прямой способ анализа XML файла.
Если вам нужны XPath
, попробуйте XPathNavigator
. Если вам нужен весь документ в памяти, попробуйте XmlDocument
.
Я не уверен, существует ли "лучшая практика для синтаксического анализа XML". Существует множество технологий, подходящих для разных ситуаций. Какой способ использовать зависит от конкретного сценария.
Вы можете пойти с LINQ в 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 без проблем!
В дополнение вы можете использовать селектор 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);
Вы можете проанализировать 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;
}
Вы можете использовать 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 очень ограничен.
ExtendedXmlSerializer может это сделать и многое другое.
ExtendedXmlSerializer поддерживает .NET 4.5 или выше и .NET Core. Вы можете интегрировать его с WebApi и AspCore.
lxml - библиотека на основе python для анализа XML для пользователей python
Вы можете использовать XmlDocument и для манипулирования или получения данных из атрибутов, которые вы можете использовать для классов Linq для XML.
вы можете попробовать использовать XDocument.Load(pathOfYourXmlFileHere)