【问题标题】:Get the contents of all elements with the same name using XML?使用 XML 获取所有同名元素的内容?
【发布时间】:2012-10-02 06:50:17
【问题描述】:

我试图在我的程序中解析一些 XML,但我似乎无法找出最好的方法。

XML 有一个称为“容器”的元素。该元素有多个称为“文本”的后代。我想做的是按顺序提取“文本”元素中的值,并将它们保存在字符串中。

所以 XML 看起来像:

<containers>
   <container>
      <elt3243> </elt3243>
      <elt1122></elt1122>
      <elt><text> Put me in a string please </text> </elt>
      <elt2211></elt2211>
   </container>
   <container>
      <elt3243><text>I would also like to be in the string</text></elt3243>
      <elt1122></elt1122>
      <elt> </elt>
      <elt2211></elt2211>
   </container>
</containers>

我想要的结果:

String result = "Put me in a string please \n I would also like to be in the string";

最好的方法是什么?

【问题讨论】:

  • 这可能在XmlDocument中吗?

标签: c# .net xml xml-parsing linq-to-xml


【解决方案1】:
XDocument doc = XDocument.Load(file.FullName);
var strings = doc.Descendants("container").SelectMany(x => x.Descendants("text")).ToList();
return strings.Join(" \n ");

【讨论】:

    【解决方案2】:

    试试这个

    XDocument xDocument = new XDocument();
    //load xml
    StringBuilder sb = new StringBuilder();
    
    foreach(var text in xDocument.Descendants("text") )
    {
    sb.append(text.value)
    }
    

    【讨论】:

      【解决方案3】:

      这是一个 Win32 控制台示例,应该可以演示您可以做什么:

      var doc = XDocument.Parse(
          "<containers>" + 
              "<container>"+
                "<elt3243> </elt3243>"+
                "<elt1122></elt1122>"+
                "<elt><text> Put me in a string please </text> </elt>"+
                "<elt2211></elt2211>"+
             "</container>"+
             "<container>"+
                "<elt3243><text>I would also like to be in the string</text></elt3243>"+
                "<elt1122></elt1122>"+
                "<elt> </elt>"+
                "<elt2211></elt2211>"+
             "</container>"+
          "</containers>", LoadOptions.None);
      
      var text = doc.Descendants("text").Select(x => x.Value);
      Console.WriteLine(string.Join(" \n ", text));
      Console.ReadKey(false);
      

      请注意,您实际上并不需要将其投影到数组或列表中,正如一些较早的答案所表明的那样。 string.Join 只需要一个分隔符和一个对象数组; IEnumerable&lt;string&gt; 到数组由运行时隐式处理。要对其进行测试,请创建一个新的 C# 控制台应用程序,并将其放入 Main()。应该按原样工作...

      【讨论】:

        【解决方案4】:

        XDocument 是你的朋友...

        var doc = XDocument.Load(...filename...);
        var strings = doc.Descendants("text").Select(x => x.Value).ToArray();
        var result = string.Join("\r\n", strings);
        

        也许还有更简单的方法使用 ForEach 扩展方法...

        【讨论】:

          【解决方案5】:

          您可以使用 XPath,请参阅此处了解更多关于 MSDN 的信息。

          所以,是这样的:

          XPathDocument document = new XPathDocument(<Source of your XML >);
          XPathNavigator navigator = document.CreateNavigator();
          
          XPathNodeIterator nodes = navigator.Select("//text");
          
          string result = "";
          while (nodes.MoveNext())
          {
              result += nodes.Current.Value + "\n";
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-01-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-13
            • 1970-01-01
            相关资源
            最近更新 更多