使用Clumsy Leaf Table资源管理器导出TableStorage数据时,我返回了以下xml:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="http://x.table.core.windows.net/"
xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
xmlns="http://www.w3.org/2005/Atom">
<title type="text">TestContents</title>
<updated />
<link rel="self" title="TestContents" href="TestContents" />
<entry>
<title type="text" />
<updated />
<author>
<name />
</author>
<link rel="edit" />
<content type="application/xml">
<m:properties>
<d:PartitionKey>010100A</d:PartitionKey>
<d:Title>ssq</d:Title>
<d:Type>1</d:Type>
</m:properties>
</content>
</entry>
<entry>
<title type="text" />
<updated />
<author>
<name />
</author>
<link rel="edit" />
<content type="application/xml">
<m:properties>
<d:PartitionKey>010100B</d:PartitionKey>
<d:Title>yy</d:Title>
<d:Type>1</d:Type>
</m:properties>
</content>
</entry>
<entry>
<title type="text" />
<updated />
<author>
<name />
</author>
<link rel="edit" />
<content type="application/xml">
<m:properties>
<d:PartitionKey>010100C</d:PartitionKey>
<d:Title>xx</d:Title>
<d:Type>1</d:Type>
</m:properties>
</content>
</entry>
</feed>
我使用以下代码:
XNamespace a = "http://www.w3.org/2005/Atom";
XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
XNamespace m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
XElement feed = XElement.Load(@"c:\data\contents.xml");
var titles =
from entry in feed.Descendants(a + "entry")
let partitionKey = entry.Element(d + "PartitionKey")
let content = entry.Element(a + "content")
let properties = content.Element(m + "properties")
let title = properties.Element(d + "Title")
select title;
foreach (var title in titles)
{
Console.WriteLine(title.Value);
}
Console.ReadLine();
从XML文件中获取数据。代码完美运作,给了我所有的价值 元素:
<d:Title>xxx</d:Title>
我现在想获得partitionKey的值。为此,我修改了行
select title:
到
select partitionKey, title;
然而,这给了我一个错误:
“无法在此范围内声明名为'title'的局部变量,因为它会为'title'赋予不同的含义,'title'已在子范围中用于表示其他内容。
有人可以提供帮助,并建议我如何获取partitionKey的值以及控制台上的标题和显示。
答案 0 :(得分:2)
您可以使用匿名类型:
XNamespace a = "http://www.w3.org/2005/Atom";
XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
XNamespace m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
XElement feed = XElement.Load("test.xml");
var result =
from entry in feed.Descendants(a + "entry")
let content = entry.Element(a + "content")
let properties = content.Element(m + "properties")
let title = properties.Element(d + "Title")
let partitionKey = properties.Element(d + "PartitionKey")
select new
{
Title = title.Value,
PartitionKey = partitionKey.Value,
};
foreach (var item in result)
{
Console.WriteLine("{0}, {1}", item.Title, item.PartitionKey);
}
或者如果您打算通过定义模型来传递当前方法之外的LINQ查询的结果:
public class Result
{
public string Result { get; set; }
public string PartitionKey { get; set; }
}
然后将LINQ查询投影到IEnumerable<Result>
:
select new Result
{
Title = title,
PartitionKey = partitionKey
};
更新:
既然你已经更新了答案并显示了你正在处理的XML,那么PartitionKey似乎是<m:properties>
的子节点,那你为什么要使用let partitionKey = entry.Element(d + "PartitionKey")
?例如,entry
表示<entry>
节点。我更新了我之前的代码示例以匹配您的XML。您应该在LINQ查询中更加小心/一致:
let partitionKey = properties.Element(d + "PartitionKey")
答案 1 :(得分:0)
select partitionKey, title;
不符合您的想法。看起来您想要返回具有两个属性的匿名类型的实例:partitionKey
和title
。为此,您必须明确声明匿名类型,即
select new { partitionKey, title };
至于你的代码行实际上做了什么,根据编译器错误文本,我认为这只是非法的语法。
注意:VB.NET编译器有点宽容。它确实将Select partitionKey, title
视为Select New With { partitionKey, title }
的语法糖,这正是您所期望的。