解析可以是单行或多行的XML文件

时间:2013-12-30 15:10:51

标签: c# xml xml-parsing

我有一个可以是一行的XML文件:

<webshop><item></item><item></item></webshop>

或多行:

<webshop>
    <item>
    </item>
    <item>
    </item>
</webshop>

或混合:

<webshop>
    <item></item>
    <item></item>
</webshop>

每个代码还有一个简短的变体,例如<webshop/><item/>,其中标签在一对&lt;&lt; &GT;括号。

每个标记都可以显示任意次数,但<item></item><item/>标记只会在<webshop> ... </webshop>内显示。此外,整个xml标记层次结构比这两个标记要大得多(但我对此问题保持简单),并且每个标记都可以具有属性。

我正在尝试使用c#中的xmlreader解析这样的xmlfile,但我总是遇到问题。

如果我尝试:

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 个答案:

答案 0 :(得分:3)

这是一个非常简单的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
}

我最初包含了更详细的结构化查询方式,以防您想要进行任何过滤或想要做一些更复杂的事情,然后只需选择给定的元素。这个简化的方法将产生与我的第一个例子相同的结果。

答案 1 :(得分:1)

请查看此堆栈溢出讨论中的答案。

binding xml elements to model in MVC4

基本上,有很多方法可以在c#代码中读取xml文件。这一切都取决于你想要达到的目标以及它的灵活性。我个人更喜欢XmlSeriealizer,因为它将xml转换为c#对象。唯一的缺点是你必须定义要转换成的xml的类。