您好我已经开发了这样的代码
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;
}
现在resutString和restultStream来自HttpClient reposnse。我从azure blob REST服务(列表)得到了回应。就像这样:
<EnumerationResults>
<Blobs>
<Blob>
<Name></Name>
<Url></Url>
<Properties></Properties>
</Blob>
<Blob>
<Name></Name>
<Url></Url>
<Properties></Properties>
</Blob>
</Blobs>
使用我的代码我已经获得了IEnumerable但是我无法在元素中找到Name na Url。我把它全部作为一行中的字符串。我如何更改代码以获取每个代码并从中获取?
答案 0 :(得分:2)
首先,一旦加载了文档,就可以使用Root
属性来获取根元素。然后,您可以使用Blob
或通过多次调用Descendants
来获取每个Elements
元素。您可以在外部 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
循环进行 之外的所有提取:
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
}
答案 1 :(得分:0)
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") });