如何从相同的名称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并写入文件,而不仅仅是最后一个值?

如何从相同的名称xml 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将包含所有节点,并且可以用作集合。如果需要,可以进行连接,但初始代码中的赋值表明您每次只是覆盖值。

相关文章: