Есть ли простой метод анализа файлов 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.