Чи є простий метод розбору XML-файлів у C #? Якщо так, то що?
Чи є простий метод розбору XML-файлів у C #? Якщо так, то що?
Відповіді:
Я використовую 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);
Також є деякі інші методи роботи. Наприклад, ось . І я думаю, що немає жодного найкращого методу для цього; завжди потрібно вибирати його самостійно, що для вас найбільше підходить.
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 до 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-серіалізатор у .NET дуже обмежений.
ExtendedXmlSerializer може зробити це та багато іншого.
Розширена підтримкаXmlSerializer .NET 4.5 або новішої версії та .NET Core . Ви можете інтегрувати його з WebApi та AspCore.
Ви можете використовувати XmlDocument, а також для маніпулювання або отримання даних з атрибутів ви можете Linq до XML-класів.