【问题标题】:Parsing XMl with unknown tag names in C#在 C# 中解析带有未知标签名称的 XMl
【发布时间】:2014-07-14 14:12:51
【问题描述】:

我正在尝试将 xml 解析为 C# 中的字符串生成器。但是 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>

正如您在示例文件中看到的,每个用户的唯一共同标签是&lt;userInfo&gt;

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

Gummy Bear1

Dorito,IloveDorito@gmail.com,eating 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+"");

【问题讨论】:

    标签: c# xml xml-parsing


    【解决方案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();
    }
    

    【讨论】:

      【解决方案2】:

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

      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 和相关类型)确实支持更强大的方法。

      【讨论】:

        【解决方案3】:

        在这里你可以得到你需要的东西

          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>
        

        输出

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-16
          • 2012-04-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多