使用C#解析通用XML字符串

时间:2013-11-19 16:05:16

标签: c# xml

假设我有以下XML字符串:

<?xml version="1.0" encoding="utf-8" ?>
<items>
  <item1>value1</item1>
  <item2>value2</item2>
  <item3>value3</item3>
  <item4>value4</item4>
  <item5>value5</item5>
  <item6>value6</item6>
</items>

我需要以通用的方式解析它,因为它可能会在以后更新,我不需要相应地修改我的代码。 所以我尝试了以下内容:

public static Dictionary<string, string> Parser(string xmlString)
{
    Dictionary<string, string> parserDictionary = new Dictionary<string, string>();
    using (StringReader stringReader = new StringReader(xmlString))
    using (XmlTextReader reader = new XmlTextReader(stringReader))
    {
           // Parse the file and display each of the nodes.
            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element:
                        parserDictionary.Add(reader.Name, reader.ReadString());
                        break;

                }
            }
    }

    return parserDictionary;      
}

此代码有两个问题:

  1. 它使用null值解析<items>元素,我不需要 解析它
  2. 忽略<item1>
  3. 请告知

2 个答案:

答案 0 :(得分:7)

为什么不这样:

var parserDictionary = XDocument.Create(xmlString)
    .Descendants("items")
    .Elements()
    .Select(elem => new { Name = elem.Name.LocalName, Value = elem.Value })
    .ToDictionary(k => k.Name, v => v.Value);

你甚至可以这样做:

var parserDictionary = XDocument.Create(xmlString)
    .Descendants("items")
    .Elements()
    .ToDictionary(k => k.Name.LocalName, v => v.Value);

答案 1 :(得分:1)

如果您需要将XML转换为对象表示而不是简单的

XDocument xDoc = XDocument.Parse(xmlString);

这就是你真正需要做的。完成后,您可以使用xDocElementsElementAttributeAttributes属性查询Descendants


举个例子,这里有一些代码可以打印你的所有值

XDocument xDoc = XDocument.Parse(xmlString);

foreach(XElement e in xDoc.Elements())
{
    Console.WriteLine(e.Value);
}