我有一个可以是一行的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,即使事先不知道确切的衬里?我想遍历所有网上商店,并为每个网上商店循环所有项目,然后对这些数据做一些事情。
答案 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的类。