[英]How can I retrieve multiple elements from an XML file
我使用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的值以及控制台上的標題和顯示。
您可以使用匿名類型:
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")
,那么為什么使用let partitionKey = entry.Element(d + "PartitionKey")
? 在示例中, entry
表示<entry>
節點。 我更新了我之前的代碼示例以匹配您的XML。 您應該在LINQ查詢中更加小心/一致:
let partitionKey = properties.Element(d + "PartitionKey")
select partitionKey, title;
不會做你認為它做的事情。 看起來您想要返回具有兩個屬性的匿名類型的實例: partitionKey
和title
。 為此,您必須明確聲明匿名類型,即
select new { partitionKey, title };
至於你的代碼行實際上做了什么,基於編譯器錯誤文本,我認為它只是非法的語法。
注意:VB.NET編譯器有點寬容。 它確實將Select partitionKey, title
作為Select New With { partitionKey, title }
語法糖處理,這是你所期望的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.