如何将XML转换为List<string>或String[]?

16

我如何将以下XML转换为List<string>String[]

<Ids>
  <id>1</id>
  <id>2</id>
</Ids>

正如Rich的回答所暗示的那样,你的回答有些含糊不清。你能说一下你想让列表包含什么吗?难道是像你的例子中的ID(“1”和“2”)吗? - Jon Skeet
你的回答正是我想要的,谢谢。虽然我想列出多个正确答案,但我不能这样做,不过你的答案是我使用的。 - Henry B
8个回答

49

看起来你更关注解析而不是完整的XML序列化/反序列化。如果你可以使用LINQ to XML,这就很容易:

using System;
using System.Linq;
using System.Xml.Linq;

public class Test
{
    static void Main()
    {
        string xml = "<Ids><id>1</id><id>2</id></Ids>";

        XDocument doc = XDocument.Parse(xml);

        var list = doc.Root.Elements("id")
                           .Select(element => element.Value)
                           .ToList();

        foreach (string value in list)
        {
            Console.WriteLine(value);
        }
    }
}

事实上,调用Elements时可以省略参数,因为只有id元素,但我想演示如何指定要获取的元素。
同样地,如果不是真正需要List<string>,我通常不会打扰调用ToList - 如果没有它,结果是IEnumerable<string>,如果只需迭代一次,则很好。要创建数组,请使用ToArray

18

以下是使用XmlDocument的方法:

// A string containing the XML data
string xml = "<Ids><id>1</id><id>2</id></Ids>";
// The list you want to fill
ArrayList list = new ArrayList();

XmlDocument doc = new XmlDocument();
// Loading from a XML string (use Load() for file)
doc.LoadXml(xml); 
// Selecting node using XPath syntax
XmlNodeList idNodes = doc.SelectNodes("Ids/id");
// Filling the list
foreach (XmlNode node in idNodes)
    list.Add(node.InnerText);

我认为只使用ArrayList而不是List<string>就可以使其兼容1.x版本,除此之外还有什么是2.0或更高版本才支持的吗? - jjxtra
真的有必要支持1.x吗?与2.0和3.x的普及相比,它并不常见。 - annakata

3

针对任何类型的集合。

例如:

<Ids> <id>C:\ videotest \ file0.txt</id> <id>C:\ videotest \ file1.txt</id> </Ids>

class FileFormat
    {
        public FileFormat(string path)
        {
            this.path = path;
        }
        public string FullPath
        {
            get { return Path.GetFullPath(path); }
        }
        public string FileName
        {
            get { return Path.GetFileName(path); }
        }
        private string path;
    }

List<FileFormat> Files =
        selectedNode
        .Descendants("Ids")
        .Elements("Id")
        .Select(x => new FileFormat(x.Value))
        .Where(s => s.FileName!=string.Empty)
        .ToList();

2

将字符串数组转换为XML的代码

items是一个字符串数组

items.Aggregate("", (current, x) => current + ("<item>" + x + "</item>"))

1

这个示例将与.NET框架3.5一起使用:

    System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse("<Ids>  <id>1</id>  <id>2</id></Ids>");
    System.Collections.Generic.List<string> ids = new System.Collections.Generic.List<string>();
    foreach (System.Xml.Linq.XElement childElement in element.Descendants("id"))
    {
        ids.Add(childElement.Value);
    }

4
这个问题似乎很适合使用 LINQ :) - Jon Skeet

1

这个示例将与.NET框架4.0一起工作:

转换为列表

    List<string> Ids= new List<string>(); 
    Ids= selectedNode.Descendants("Ids").Elements("Id").Select(> x=>x.Value).Where(s =>s!= string.Empty).ToList();

转换为字符串数组

    string[] Ids= thisNode
                  .Descendants("Ids")          // Ids element
                  .Elements("Id")              // Id elements
                  .Select(x=>x.Value)          // XElement to string
                  .Where(s =>s!= string.Empty) // must be not empty
                  .ToArray();                  // string to string []

0
你可以使用 Properties 类。
Properties prop = new Properties();
prop.loadFromXML(stream);
Set set = prop.keySet();

您可以通过每个键访问设置中的字符串。键是xml元素名称。


请说明Properties类的完整名称。它属于哪个命名空间? - John Saunders
Properties类表示一组持久性的属性。可以将这些属性保存到流中或从流中加载它们。在属性列表中,每个键及其对应的值都是一个字符串。属性列表可以包含另一个属性列表作为其“默认值”;如果在原始属性列表中未找到属性键,则会搜索第二个属性列表。 - shake

0

以下是使用数据集从 XML 获取类型化数组的方法。(在此示例中,获取的是双精度浮点数数组)

DataSet dataSet = new DataSet()
DoubleArray doubles = new DoubleArray(dataSet,0);

dataSet.ReadXml("my.xml");
double a = doubles[0];



public class DoubleArray
{
  DataSet dataSet;
  int tableIndex;
  public DoubleArray(DataSet dataSet,int tableIndex)
  {
    this.dataSet=dataSet;
    this.tableIndex=tableIndex;
  }

  public double this[int index]
  {
    get
    { 
      object ret = dataSet.Tables[tableIndex].Rows[index];
      if(ret is double?) 
        return (ret as double?).Value;
      else
        return double.Parse(ret as string);
    }
    set
    {
      object out = dataSet.Tables[tableIndex].Rows[index];
      if(out is double?)
        dataSet.Tables[tableIndex].Rows[index] = (double?)value;
      else
        dataSet.Tables[tableIndex].Rows[index] = value.ToString();
    }
  }
}

当然,每次解析双精度浮点数并将其转换回字符串可能会被一些程序员视为亵渎...即使对我来说,也很难不考虑这样的资源浪费...但我想有时候最好还是别太在意了,不要让它成为负担 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接