如何从XElement获取标签

问题描述 投票:0回答:2

我已经开发了这样的代码:

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>

c# xml-parsing windows-runtime windows-store-apps azure-storage-blobs
2个回答
2
投票

首先,一旦您加载了文档,就可以使用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
}

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") });
© www.soinside.com 2019 - 2024. All rights reserved.