Есть ли простой метод синтаксического анализа файлов XML в C#? Если так, то?
Хорошо, я снова открыл это. Дубликат был решением XML Reader, поскольку речь шла о синтаксическом анализе файлов XML. возможный дубликат можно увидеть в вопросах истории редактировать ps @GeorgeStocker
@JeremyThompson Одна из причин, по которой это был дубликат, заключается в том, что на другой вопрос есть гораздо лучший ответ. Верхний ответ, представляющий собой простой ответ "только ссылка", бесполезен.
@GeorgeStocker, вопросы достаточно разные, чтобы сосуществовать, и оба имеют ответы здорово, плюс принятые используют разные технологии. Вот почему я проголосовал за то, чтобы оставить это открытым, я знаю, что это принято только по ссылке, но это MSDN и было написано в то время, когда это было неприемлемо, надеюсь, побочный эффект повторного открытия немного подбодрит Джона, прочитай его профиль. В любом случае ура.





Я бы использовал LINQ to XML, если вы используете .NET 3.5 или выше.
Я попытался использовать это, но не смог понять, как получить что-то столь же простое, как значение идентификатора определенного элемента в моем XML (или как получить элемент по идентификатору, если на то пошло). Напротив, с помощью XmlDocument я смог сделать это с минимальными усилиями.
Я не уверен, существует ли «лучшая практика для синтаксического анализа XML». Существует множество технологий, подходящих для разных ситуаций. Какой способ использовать, зависит от конкретного сценария.
Вы можете использовать LINQ to XML, XmlReader, XPathNavigator или даже регулярные выражения. Если вы уточните свои потребности, я могу попытаться дать несколько предложений.
регулярное выражение для xml. ты монстр.
Используйте XmlTextReader, XmlReader, XmlNodeReader и пространство имен System.Xml.XPath. И (XPathNavigator, XPathDocument, XPathExpression, XPathnodeIterator).
Обычно XPath упрощает чтение XML, что вы, возможно, и ищете.
К вашему сведению, вы не должны использовать new XmlTextReader() или new XmlTextWriter(). Они устарели с .NET 2.0. Вместо этого используйте XmlReader.Create() или XmlWriter.Create().
Если вы используете .NET 2.0, попробуйте XmlReader и его подклассы XmlTextReader и XmlValidatingReader. Они обеспечивают быстрый и легкий (использование памяти и т. д.) Способ анализа XML-файла только вперед.
Если вам нужны возможности XPath, попробуйте XPathNavigator. Если вам нужен весь документ в памяти, попробуйте XmlDocument.
Все очень просто. Я знаю, что это стандартные методы, но вы можете создать свою собственную библиотеку, чтобы справиться с этим намного лучше.
Вот некоторые примеры:
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);
Кроме того, есть несколько другие методы, с которыми можно поработать. Например, здесь. И я думаю, что нет лучшего способа сделать это; всегда нужно выбирать самому, что больше всего подходит именно вам.
+1 за упоминание XmlDocument, что в некоторых случаях намного удобнее, чем интерфейсы сериализации. Если вам нужен один конкретный элемент, вы можете получить доступ к дочерним элементам с помощью индексатора: xmlDoc ["Root"], и их можно связать в цепочку: xmlDoc ["Root"] ["Folder"] ["Item"], чтобы откопать иерархия (хотя разумно проверить, что эти элементы действительно существуют)
InnerText здесь получает значение этого узла, объединенное со всеми значениями дочерних узлов, верно? Кажется странным - хотеть.
Программист со списком подруг? Шенаниганы!
@ E.vanPutten не в наши дни. Это не месть ботаников
@DonCheadle Если вы не ожидаете, что быть будет содержать какие-либо дочерние узлы, тогда InnerText просто вернет значение узла - это то, что я (и, вероятно, все остальные, читающие этот вопрос), анализирую XML, чтобы найти в первую очередь.
Я думаю, это должен быть принятый ответ. XmlDocument намного удобнее использовать в «простых» ситуациях.
Используйте хороший Схема XSD для создания набора классов с xsd.exe и используйте XmlSerializer для создания дерева объектов из вашего XML и наоборот. Если у вас есть несколько ограничений для вашей модели, вы можете даже попытаться создать прямое сопоставление между вашими классами модели и XML с помощью атрибутов Xml *.
На MSDN есть вводная статья о сериализации XML.
Совет по производительности: создание XmlSerializer - дорогое удовольствие. Сохраните ссылку на свой экземпляр XmlSerializer, если вы собираетесь анализировать / записывать несколько файлов XML.
См. codeproject.com/KB/cs/xsdtidy.aspx и blog.dotnetwiki.org/XsdTidyXSDMappingBeautifier.aspx.
Хорошим примером является «Пример заказа на поставку» в середине этого примера от Microsoft. msdn.microsoft.com/en-us/library/58a18dwa.aspx. Вам не нужно создавать схему - ваш класс C# - это схема, украшенная атрибутами C#.
Если вы обрабатываете большой объем данных (много мегабайт), вам нужно использовать XmlReader для потокового анализа XML.
Все остальное (XPathNavigator, XElement, XmlDocument и даже XmlSerializer, если вы сохраните полностью сгенерированный граф объекта) приведет к высокое использование памяти, а также к очень медленному времени загрузки.
Конечно, если вам все равно нужны все данные в памяти, у вас может не быть особого выбора.
Вы можете использовать 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.
Вы можете проанализировать 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;
}
Кроме того, вы можете использовать селектор 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);
Вы можете использовать XmlDocument, а для манипулирования или извлечения данных из атрибутов вы можете Linq to XML-классы.
Совсем недавно меня попросили поработать над приложением, которое включало синтаксический анализ 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-файла!
вы можете использовать эту реализацию: stackoverflow.com/a/34813985/5784646