在C#中解析具有未知标记名称的XMl

时间:2014-07-14 14:12:52

标签: c# xml xml-parsing

我正在尝试将xml解析为C#中的stringbuilder。但XML文件中包含未确定的标记名称。我不想使用xdoc.elements("tagName")来放置元素名称。我希望我可以动态循环遍历XML文件。

我拥有的XML是这样的:

 <userInfo>
        <name> Gummy Bear </name>
        <age> 1 </age>
 </userInfo>

 <userInfo>
        <name> Dorito </name>
        <Email> IloveDorito@gmail.com </email>
        <hobby> eating Doritos </hobby>
 </userInfo>

正如您在示例文件中看到的,每个用户唯一的共同标记是<userInfo>

理想的输出将按每个用户分组:

Gummy Bear1

DoritoIloveDorito@gmail.comeating Doritos

我有以下代码,但它将一个用户下的所有元素合并为一行。

 StringBuilder result = new StringBuilder();
 XDocument xdoc = XDocument.Load(@"test.xml");
 var userNode = xdoc.Root.Elements("userInfo");
 foreach(var d in userNode)
 {
        result.append(d.value):
 }
MessageBox.show (result+"");

3 个答案:

答案 0 :(得分:1)

var userInfos = XDocument.Load(filename)
        .Descendants("userInfo")
        .Select(d => d.Elements().ToDictionary(e => e.Name.LocalName, e => (string)e))
        .ToList();



foreach (var ui in userInfos)
{
    foreach (var item in ui)
    {
        Console.WriteLine(item.Key + " > " + item.Value);
    }
    Console.WriteLine();
}

答案 1 :(得分:0)

在这里你如何得到你需要的东西

  static void Main(string[] args)
        {    
            var userInfos = XElement.Load("file.xml").Descendants("userInfo").Select(elt =>
            {
                var  line = elt.Descendants();
                return  string.Join(",", line.Select(subElt => subElt.Value)); 
            });
            foreach (var userInfo in userInfos)
            {
                Console.WriteLine(userInfo);
            }
Console.ReadLine();  


        }

//我想你有一个像这样的XML文件

<root>
<userInfo>
  <name> Gummy Bear </name>
  <age> 1 </age>
</userInfo>

<userInfo>
  <name> Dorito </name>
  <email>IloveDorito@gmail.com </email>
    <hobby> eating Doritos </hobby>
 </userInfo>
</root>

输出

enter image description here

答案 2 :(得分:0)

代码中最小的变化是基本的嵌套循环:

foreach(var userInfo in xdoc.Root.Elements("userInfo"))
{
    var details = userInfo.Elements();
    if (details.Count() > 0)
    {
        foreach(var detail in details)
        {
            result.Append(detail.Value.Trim() + ", ");
        }
        result.Remove(result.Length - 2, 2).Append("\n");
    }
}

LINQ to XML(即XDocument及相关类型)确实支持更强大的方法,正如其他答案所示。

相关问题