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>fromを取得できましたが、要素にアクセスしたり内部にアクセスしたり<Blobs>することはできません。すべてを1行の文字列として取得します。それぞれを取得して取得するには、コードをどのように変更する必要がありますか?NameUrl<Blob><Blob><Name><Url>

4

2 に答える 2

3

まず、ドキュメントを読み込んだら、Rootプロパティを使用してルート要素を取得できます。次に、への複数の呼び出しを使用して、またはそれを介して各Blob要素を取得できます。ただし、ループの外側でそれを行うことができます。DescendantsElementsforeach

var doc = XDocument.Load(resultStream);
var allBlobs = doc.Root.Elements("Blobs").Elements("Blob");

またはvardoc= 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 に答える