У меня есть XML-файл, который может быть однострочным:
<webshop><item></item><item></item></webshop>
Или многострочный:
<webshop>
<item>
</item>
<item>
</item>
</webshop>
Или смешанные:
<webshop>
<item></item>
<item></item>
</webshop>
У каждого тега также есть короткие варианты, такие как <webshop/>
и <item/>
, где тег открывается и закрывается в одной паре скобок <>.
Каждый тег может применяться любое количество раз, но тег <item></item>
или <item/>
будет применяться только внутри <webshop> ... </webshop>
. Кроме того, вся иерархия тегов xml намного больше, чем только эти два тега (но я упростил этот вопрос), и каждый тег может иметь атрибуты.
Я пытаюсь разобрать такой xmlfile с помощью xmlreader в C # , но всегда сталкиваюсь с проблемой.
Если я попробую:
while(reader.ReadToFollowing("webshop"))
{
Console.WriteLine("webshop");
//get attributes of webshop tag and do something...
while(reader.ReadToFollowing("item"))
{
Console.WriteLine("Item");
//get attributes of item tag and do something...
}
}
Я никогда не получаю все данные, если xml однострочный, смешанный или теги закрываются сами по себе (<item/>
вместо <item></item>
). В большинстве случаев читатель просто останавливается после одного экземпляра <webshop>
или <item>
Есть ли надежный способ проанализировать этот xml, даже если точная подкладка не известна заранее? Я хочу перебрать все интернет-магазины и для каждого интернет-магазина перебрать все элементы, а затем что-то сделать с этими данными.
2 ответа
Вот очень простой способ Linq to XML читать ваш XML-файл:
var xml = @"<webshop><item></item><item></item></webshop>";
var reader = XDocument.Parse(xml);
var webshops = from w in reader.Elements("webshop")
select w;
foreach(var shop in webshops)
{
var items = from i in shop.Elements("item")
select i;
//can now grab any attributes of the items
}
Без более подробной информации об атрибутах в этих элементах я не могу представить более подробную информацию в примере, но я думаю, что этого достаточно, чтобы показать вам, как это можно сделать.
Если вы не собираетесь выполнять фильтрацию и просто хотите, чтобы все элементы webshop
, а затем составляющие их подэлементы item
, вы можете упростить то, что я сделал выше, следующим образом:
var webshops = reader.Elements("webshop");
foreach(var shop in webshops)
{
var items = shop.Elements("item");
//can now grab any attributes of the items
}
Первоначально я включил более подробный способ структурирования запросов на случай, если вы захотите выполнить какую-либо фильтрацию или захотите сделать что-то более сложное, чем просто выбрать данные элементы. Этот упрощенный метод даст те же результаты, что и мой первый пример.
Взгляните на ответ в этом обсуждении переполнения стека.
привязка элементов xml к модели в MVC4
По сути, есть много способов читать XML-файлы в вашем коде C #. Все зависит от того, чего вы пытаетесь достичь и насколько гибким оно должно быть. Лично я предпочитаю XmlSeriealizer
, поскольку он переводит xml в объекты C #. Единственным недостатком является то, что вам нужно определить классы, в которые xml будет переводить.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.