0

我开发了这样的代码:

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;
}

现在resultStringresultStream来自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>

4

2 回答 2

3

首先,一旦您加载了文档,您就可以使用该Root属性来获取根元素。然后,您可以使用或通过多次调用来获取每个Blob元素。您可以在循环之外执行此操作:DescendantsElementsforeach

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
}
于 2013-02-06T13:59:21.123 回答
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") });
于 2013-02-06T13:58:30.080 回答