У меня есть 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, даже если точная подкладка не известна заранее? Я хочу перебрать все интернет-магазины и для каждого интернет-магазина перебрать все элементы, а затем что-то сделать с этими данными.

1
user1884155 30 Дек 2013 в 19:10

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
}

Первоначально я включил более подробный способ структурирования запросов на случай, если вы захотите выполнить какую-либо фильтрацию или захотите сделать что-то более сложное, чем просто выбрать данные элементы. Этот упрощенный метод даст те же результаты, что и мой первый пример.

3
Sven Grosen 30 Дек 2013 в 15:31

Взгляните на ответ в этом обсуждении переполнения стека.

привязка элементов xml к модели в MVC4

По сути, есть много способов читать XML-файлы в вашем коде C #. Все зависит от того, чего вы пытаетесь достичь и насколько гибким оно должно быть. Лично я предпочитаю XmlSeriealizer, поскольку он переводит xml в объекты C #. Единственным недостатком является то, что вам нужно определить классы, в которые xml будет переводить.

1
Community 23 Май 2017 в 12:03