我已经开发了这样的代码:
String resultString = await response.Content.ReadAsStringAsync();
Stream resultStream = await response.Content.ReadAsStreamAsync();
XElement rootElement = XDocument.Load(resultStream).Elements().First();
XElement blobs = rootElement.Element("Blobs");
foreach (var blob in blobs.Elements("Blob"))
{
var t = blob;
}
现在resultString
和resultStream
来自HttpClient reposnse
。我从Azure blob REST服务(列表)获得响应,如下所示:
<EnumerationResults>
<Blobs>
<Blob>
<Name></Name>
<Url></Url>
<Properties></Properties>
</Blob>
<Blob>
<Name></Name>
<Url></Url>
<Properties></Properties>
</Blob>
</Blobs>
</EnumerationResults>
[使用我的代码,我设法从IEnumerable<XNode>
中获得了<Blobs>
,但是我无法到达Name
元素内的Url
和<Blob>
。我将所有内容以字符串形式显示在一行中。如何更改我的代码以获取每个<Blob>
并从中获取<Name>
和<Url>
?
首先,一旦您加载了文档,就可以使用Root
属性获取根元素。然后,您可以使用Blob
或通过多次调用Descendants
来获取每个Elements
元素。您可以通过outside foreach
循环执行此操作:
var doc = XDocument.Load(resultStream);
var allBlobs = doc.Root.Elements("Blobs").Elements("Blob");
或var doc = XDocument.Load(resultStream);var allBlobs = doc.Root.Descendants(“ Blob”);
现在,当您遍历每个Blob时,可以再次使用Element
获得name元素,并通过使用显式字符串转换来获得该元素的文本内容
foreach (var blob in allBlobs)
{
var nameElement = blob.Element("Name");
var nameText = (string) nameElement;
...
}
显然,可以将其作为单个语句来完成-为了清楚起见,我只是想将它们分开。然后,您可以对URL执行相同的操作。如果缺少该元素,则使用字符串转换为您提供null
引用,而使用Value
属性将为您提供NullReferenceException
,除非您加以注意。哪个更合适取决于您的用例。
另一种方法是在查询中对foreach
循环进行所有提取outside:
var data = doc.Root.Elements("Blobs").Elements("Blob")
.Select(blob => new {
Name = (string) blob.Element("Name"),
Url = (string) blob.Element("Url");
});
然后:
foreach (var item in data)
{
// Use item.Name and item.Data in here
}
XElement blobs = rootElement.Element("Blobs");
var v = blobs.Select(blob => new { Name = blob.Descendents.FirstOrDefault(x => x.Name.LocalName == "Name"), Url = blob.Descendants.FirstOrDefault(x => x.Name.LocalName == "Url") });