如何从XElement获取标签

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从XElement获取标签相关的知识,希望对你有一定的参考价值。

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

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>

答案

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

以上是关于如何从XElement获取标签的主要内容,如果未能解决你的问题,请参考以下文章

C#:如何从 XElement 中获取名称(带前缀)作为字符串?

C# XElement 没有多次为同一个标签获取多个值

从 XElement 获取子元素 [重复]

如何在c#中使用xelement获取xml节点值

从具有多个命名空间的 XElement 中获取元素

如何使用 XElement 在标签之间添加值?