如何从XElement获取标签

时间:2013-02-06 13:54:50

标签: c# xml-parsing windows-runtime windows-store-apps azure-storage-blobs

您好我已经开发了这样的代码

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。我把它全部作为一行中的字符串。我如何更改代码以获取每个代码并从中获取?     

2 个答案:

答案 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") });