Есть ли простой метод анализа XML-файлов на C#? Если да, то?Как обрабатывать XML-файлы?
ответ
Я бы использовал LINQ to XML, если вы в .NET 3.5 или выше.
Я не уверен, существует ли «наилучшая практика для синтаксического анализа XML». Существует множество технологий, подходящих для разных ситуаций. Какой способ использования зависит от конкретного сценария.
Вы можете написать LINQ to XML, XmlReader
, XPathNavigator
или даже регулярные выражения. Если вы уточните свои потребности, я могу попытаться дать некоторые предложения.
regex для xml. вы монстр. – will 2017-10-20 09:14:47
Использование XmlTextReader
, XmlReader
, XmlNodeReader
и пространство имен System.Xml.XPath
. И (XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
).
Обычно XPath
упрощает чтение XML, что вы ищите.
Если вы используете .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);
Кроме того, есть некоторые other methods работать. Например, here. И я думаю, что нет лучшего способа сделать это; вам всегда нужно выбрать его самостоятельно, что наиболее подходит для вас.
Используйте хороший XSD Schema, чтобы создать набор классов с xsd.exe и используйте XmlSerializer
, чтобы создать дерево объектов из вашего XML и наоборот. Если у вас мало ограничений на вашу модель, вы даже можете попытаться создать прямое сопоставление между классами модели и XML с помощью атрибутов Xml *.
На MSDN имеется an introductory article about XML Serialisation.
Рекомендация: Построение XmlSerializer
стоит дорого. Сохраните ссылку на свой экземпляр XmlSerializer
, если вы собираетесь анализировать/записывать несколько файлов XML.
Если вы обрабатываете большой объем данных (много мегабайт), то вы хотите использовать XmlReader
для потоковой обработки XML-данных.
Все остальное (XPathNavigator
, XElement
, XmlDocument
и даже XmlSerializer
если вы сохраняете полный сгенерированный граф объектов) приведет к high memory usage, а также очень медленное время загрузки.
Конечно, если вам все же нужны все данные в памяти, у вас может не быть выбора.
Вы можете использовать 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 очень ограничен.
- не поддерживает сериализацию класса с круговой ссылкой или класса с интерфейсом собственности,
- Не поддерживает словари,
- Там нет механизма для чтения старой версии XML,
- Если вы хотите создать собственный сериализатор, ваш класс должен наследовать от IXmlSerializable. Это означает, что ваш класс не будет классом POCO,
- Не поддерживает IoC.
ExtendedXmlSerializer может это сделать и многое другое.
поддержка ExtendedXmlSerializer .NET 4.5 или выше и .NET Ядро. Вы можете интегрировать его с 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 для XML.
Мне недавно потребовалось работать над приложением, которое включало анализ XML-документа, и я согласен с Джоном Галлоуэем в том, что подход на основе LINQ to XML, на мой взгляд, лучший. Тем не менее, мне пришлось немного подражать, чтобы найти пригодные для использования примеры, поэтому без дальнейших церемоний, вот несколько!
Любые комментарии приветствуются, поскольку этот код работает, но может и не быть идеальным, и я хотел бы узнать больше о разборе XML для этого проекта!
public void ParseXML(string filePath)
{
// create document instance using XML file path
XDocument doc = XDocument.Create(filePath);
// set the namespace to that within of the XML (xmlns="...")
XNamespace ns = "http://www.example.com/NameSpace";
// 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-файла без проблем!
- 1. Как обрабатывать iframe в конкретной ситуации. Как обрабатывать содержимое iframe?
- 2. Как правильно обрабатывать исключения?
- 3. Как обрабатывать уведомления службой?
- 4. Как обрабатывать загрузку файлов?
- 5. Как правильно обрабатывать фокус
- 6. Как обрабатывать документы PDF?
- 7. Как обрабатывать ориентацию подзаголовка?
- 8. C# Как обрабатывать строку?
- 9. Как обрабатывать очереди вручную
- 10. Как обрабатывать InterruptedException BlockingQueue?
- 11. Как обрабатывать сечение дату
- 12. Как обрабатывать повторяющиеся хэши
- 13. Как обрабатывать все жесты
- 14. Как обрабатывать Selenium кадр
- 15. Как обрабатывать System.CannotUnloadAppDomainException?
- 16. Как обрабатывать каждый контур?
- 17. Как обрабатывать сообщение EXCEPT?
- 18. Как обрабатывать ошибки CLLocationManager?
- 19. Как обрабатывать события UserControl
- 20. как обрабатывать HTREEITEM
- 21. Как обрабатывать сокеты
- 22. Как обрабатывать пустой AliasSeq?
- 23. Python: Как обрабатывать UnicodeEncodeError?
- 24. Как обрабатывать сортировку «строк»?
- 25. Как обрабатывать java.net.ConnectException эффективно
- 26. Как обрабатывать взаимодействующие декораторы
- 27. Как правильно обрабатывать ZoneLocalMapping.ResultType.Ametiguous?
- 28. Как обрабатывать неизвестную кодировку
- 29. Как обрабатывать многомерный массив?
- 30. Как обрабатывать org.hibernate.ConstraintViolationException
Вы можете использовать эту реализацию: http://stackoverflow.com/a/34813985/5784646 – Eulogy 2016-01-19 12:59:35
Хорошо, я снова открыл это. Дубликат был решением для чтения XML, поскольку это касается разбора XML-файлов. * Возможный дубликат * можно увидеть в вопросах [edit] history ps @GeorgeStocker – 2016-11-24 10:46:17
@JeremyThompson Одной из причин, почему это был дубликат, является другой вопрос, который имеет гораздо лучший ответ. Самый верный ответ - простой ответ «ссылка только» не полезен. – 2016-11-24 18:49:10