【问题标题】:How to use XML and LINQ如何使用 XML 和 LINQ
【发布时间】:2013-12-25 18:03:55
【问题描述】:

使用 .net 4.5 VS 2012

我正在尝试从 XMl 文件中读取数据

<?xml version="1.0" encoding="utf-8"?>
<userCategories>
  <Cat>General</Cat>
  <Cat>Science</Cat>
  <Cat>HelloWorld</Cat>
</userCategories>

这是我写的代码:

//create XML document from file
XDocument myCatList = XDocument.Load(categoryPath);
//get all categories using LINQ
var myCategories =
    from element in myCatList.Descendants("userCategories")
//select all elements in XML where Element has name Cat - mean all if file like i write before
    select element.Element("Cat").Value;
    //create string for result
string data = String.Empty;
use foreach for getting all categories
foreach (var userCat in myCategories)
{
    //put in one string 
    data += string.Format("{0}\n", userCat);
}

所以我认为这种 LINQ 请求必须返回一个包含所有值的字符串数据(General \n Science \n HelloWorld \n)。但结果我只得到了将军。

我错过了什么?为什么我只从 XML 中获取 Item General 而不是所有节点?

【问题讨论】:

  • 顺便说一句。像这样使用string += 真的很糟糕!
  • @Thomas Weller 为什么? - 我只是将所有值添加到格式化字符串,然后使用它
  • 因为字符串必须在每个循环周期中完全重新分配(非常慢并导致严重的内存碎片)。这就是 StringBuilder 存在的原因。
  • 对此表示感谢!使用s.Append(userCat + '\n'); where s - StringBuilder

标签: c# .net xml linq


【解决方案1】:

使用聚合也可以解决问题

XDocument myCatList = XDocument.Load(@"D:\a.xml");    
var myCategories = myCatList.Elements("userCategories").Descendants("Cat").Select(s => s.Value).Aggregate(new StringBuilder(), (s,i) => s.Append(i + "\n"));

【讨论】:

    【解决方案2】:

    myCatList.Descendants("userCategories") 返回名为 &lt;userCategories&gt; 的所有元素的集合。
    你只有一个这样的元素。

    select element.Element("Cat") 返回每​​个元素中的第一个 &lt;Cat&gt; 子元素。

    您想选择所有 &lt;Cat&gt; 元素:

    from elem myCatList.Descendants("cat")
    select elem.Value
    

    【讨论】:

    • 我认为 Descendants 返回所有子元素的集合,因此 &lt;userCategories&gt; - &lt;Cat&gt; 的所有子元素的集合,而不仅仅是尝试获取此集合中的所有元素。谢谢你的解释。谢谢
    • @Kirill:不;那将是.Elements()
    • 你的意思是像var d = from element in myCatList.Elements("userCategories") select element.Value;?尝试 - 它在一个字符串中返回所有内容
    • @Kirill: Descendants()Elements() 返回您要求的元素,而不是他们的孩子。要获取该元素的子元素,请调用.Elements() 对其
    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 2013-10-22
    • 2013-04-08
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多