通过linq从XML获取价值

时间:2012-02-16 10:44:40

标签: c# xml linq

所以我根本不愿意发布它,因为已经有关于它的无限文件。已经2年了,我接触过LINQ,现在它正在挖掘我。经过3个小时的连续尝试和失败,我决定做我不愿意做的事情。发布到SO。

我有这个XML

<TopMost xmlns="http://abc.com/">
    <Mine>MyName</Mine>
    <Hello>
        <File>SIMPLE</File>
        <Book>20</Book>
        <Copy>0</Copy>
    </Hello>
</TopMost>

我只想获得&#34; File&#34;,&#34; Book&#34;,&#34; Copy&#34;的值。并希望将其与单元测试中的内容进行比较。

我达到了这个目标:

string result = string.Empty;
const string path = @"C:\Library.xml";
XDocument xdoc = XDocument.Load(path);

var lv1s = from paper in xdoc.Descendants("Hello")
    select new
        {
            fileP = paper.Element("File").Value,
            bookP = paper.Element("Book").Value,
            copyP = paper.Element("Copy").Value,
        };
result += lv1s.fileP + lv1s.bookP + lv1s.copyP;  // Error
MessageBox.Show(result);

错误:序列不包含元素

我知道必须有一个简单的方法,我离它很远。我有很多这样的代码片段,我尝试过但都失败了。

修改

var lv1s = from paper in xdoc.Descendants(ns + "Hello")
    select new
        {
            fileP = paper.Element(ns + "File").Value,
            bookP = paper.Element(ns + "Book").Value,
            copyP = paper.Element(ns + "Copy").Value,
        };

我收到编译错误。

Error: The Name ns doex not exist in current context.

1 个答案:

答案 0 :(得分:5)

您需要指定命名空间:

XNamespace ns = "http://abc.com/";  // or: doc.Root.GetDefaultNamespace()

var lv1s = from paper in xdoc.Descendants( ns + "Hello")
   select new
        {
            fileP = paper.Element(ns +"File").Value,
            bookP = paper.Element(ns +"Book").Value,
            copyP = paper.Element(ns +"Copy").Value,
        };

不要试图使用string nsvar ns