如何从相同的名称xml c#中获取所有值
本文关键字:获取 xml | 更新日期: 2023-09-27 18:21:07
我的目的是制作一个程序,创建一个新的文件目标,该目标从另一个文件中获取一些值。XML文件:
<?xml version="1.0"?>
<house>
<chairs count="3">
<chairs>a</chairs>
<chairs>b</chairs>
<chairs>c</chairs>
</chairs>
</house>
我所做的:
static void Main(string[] args)
{
using (XmlReader reader = XmlReader.Create("file.xml"))
{
while (reader.Read())
{
if (reader.IsStartElement())
{
switch (reader.Name)
{
case "chairs":
if (reader.Read())
{
string l;
l = reader.Value.Trim();
//(*)
}
break;
}
}
}
}
// (**)f = l + " ";
如果我在*行写:
Console.WriteLine(l), it will print me:
a
b
c
但是,如果我删除(*)并取消对(**)的注释,在新创建的文件中,它只显示c,因为我认为它会因为串联而覆盖a和b。可以取所有值a、b、c并写入文件,而不仅仅是最后一个值?
有很多方法可以做到这一点。
-
像一样在XmlReader上使用简单迭代
-
使用XPath/XQuery查询(
XmlDocument.DocumentElement.SelectNodes("''chairs")
) -
使用Linq2Xml
-
使用Linq2Xml和Xpath
但是使用xml最方便的方法之一(当您提前了解模式时)是使用XSD.exe并为您的模式生成类,然后将xml反序列化为类并使用C#类。
试试这个:
static void Main(string[] args)
{
List<string> strings = new List<string>();
using (XmlReader reader = XmlReader.Create("file.xml"))
{
while (reader.Read())
{
if (reader.IsStartElement())
{
switch (reader.Name)
{
case "chairs":
if (reader.Read())
{
strings.Add(reader.Value.Trim());
}
break;
}
}
}
}
这样,列表strings
将包含所有节点,并且可以用作集合。如果需要,可以进行连接,但初始代码中的赋值表明您每次只是覆盖值。