Есть ли простой метод анализа файлов XML в C #? Если так, то?
Есть ли простой метод анализа файлов XML в C #? Если так, то?
Ответы:
Я бы использовал 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);
Также есть несколько других методов для работы. Например, здесь . И я думаю, что нет лучшего способа сделать это; Вы всегда должны выбрать его самостоятельно, то, что наиболее подходит для вас.
InnerText
здесь получает значение этого узла, объединенного со всеми значениями дочерних узлов - верно? Кажется странным хотеть.
InnerText
просто вернете значение узла - это то, что я (и, вероятно, все остальные, читающие этот вопрос) анализирую в первую очередь для XML.
Используйте хорошую схему XSD для создания набора классов с помощью xsd.exe и используйте XmlSerializer
для создания дерева объектов из вашего XML и наоборот. Если у вас мало ограничений на вашу модель, вы можете даже попытаться создать прямое отображение между классами модели и XML с помощью атрибутов Xml *.
Есть вводная статья о Сериализации XML на MSDN.
Совет по производительности: Строительство это XmlSerializer
дорого. Сохраните ссылку на ваш XmlSerializer
экземпляр, если вы собираетесь анализировать / записывать несколько файлов XML.
Если вы обрабатываете большой объем данных (много мегабайт), то вы хотите использовать XmlReader
для потокового анализа XML.
Все остальное ( XPathNavigator
, XElement
, XmlDocument
и даже XmlSerializer
если вы держите полный сгенерированный граф объектов) приведет к высокой загрузке памяти , а также очень медленное время загрузки.
Конечно, если вам все равно нужны все данные в памяти, у вас может не быть большого выбора.
Используйте XmlTextReader
, XmlReader
, XmlNodeReader
и System.Xml.XPath
пространство имен. И ( XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
).
Обычно XPath
облегчает чтение XML, что вы можете искать.
new XmlTextReader()
или new XmlTextWriter()
. Они устарели с .NET 2.0. Используйте XmlReader.Create()
или XmlWriter.Create()
вместо.
Я только недавно был обязан работать над приложением, которое занималось разбором 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 без проблем!
Если вы используете .NET 2.0, попробуйте XmlReader
и его подклассы XmlTextReader
, и XmlValidatingReader
. Они обеспечивают быстрый, легкий (использование памяти и т. Д.) Единственный способ анализа файла XML.
Если вам нужны XPath
возможности, попробуйте XPathNavigator
. Если вам нужен весь документ в памяти, попробуйте XmlDocument
.
Кроме того, вы можете использовать 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». Существует множество технологий, подходящих для разных ситуаций. Какой способ использования зависит от конкретного сценария.
Вы можете пойти с LINQ к XML , XmlReader
, XPathNavigator
или даже регулярные выражения. Если вы уточните свои потребности, я могу попытаться дать некоторые предложения.
Вы можете проанализировать 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 Serializer в .NET очень ограничен.
ExtendedXmlSerializer может сделать это и многое другое.
ExtendedXmlSerializer поддерживает .NET 4.5 или выше и .NET Core . Вы можете интегрировать его с WebApi и AspCore.
Вы можете использовать XmlDocument и для манипулирования или извлечения данных из атрибутов вы можете Linq для классов XML.