解析 xml 中的字符串 windows phone 8

Parsing xml string in windows phone 8

我有以下 xml 字符串:

<AssumeRoleWithWebIdentityResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
  <AssumeRoleWithWebIdentityResult>
    <SubjectFromWebIdentityToken>us-east-1:xxxx</SubjectFromWebIdentityToken>
    <Audience>us-east-1:xxxxxxxx</Audience>
    <AssumedRoleUser>
      <Arn>arn:aws:sts::xxxxxx/xxxxxx</Arn>
      <AssumedRoleId>xxxx</AssumedRoleId>             
    </AssumedRoleUser>
    <Credentials>      
      <SessionToken>xxxxxx</SessionToken>
      <SecretAccessKey>xxxxx</SecretAccessKey>
      <Expiration>2015-02-03T15:26:03Z</Expiration>
      <AccessKeyId>xxxxxxx</AccessKeyId>
    </Credentials>
    <Provider>xxxxx</Provider>
  </AssumeRoleWithWebIdentityResult>
  <ResponseMetadata>
    <RequestId>xxxxxx</RequestId>
  </ResponseMetadata>
</AssumeRoleWithWebIdentityResponse>

我想在 <Credentials> 节点中检索 SessionToken

我尝试了以下方法:

XDocument xdoc = XDocument.Parse(response);
var root = xdoc.Root.Element("AssumeRoleWithWebIdentityResponse");

但是变量 root 返回 null。

如何从 <Credentials> 节点检索 SessionToken?

你犯了两个错误:

  • 根元素下 没有 AssumeRoleWithWebIdentityResponse 元素;它根元素
  • AssumeRoleWithWebIdentityResponse 元素位于命名空间 (https://sts.amazonaws.com/doc/2011-06-15/") 中,因此您需要在调用 Element 或类似的任何内容时指定它。所有后代元素也都继承该名称空间,除非它们指定了不同的内容。

例如:

XNamespace ns = https://sts.amazonaws.com/doc/2011-06-15/";
var root = xdoc.Root;
var result = root.Element(ns + "AssumeRoleWithWebIdentityResult");

要从 Credentials 标签中获取 SessionToken,您可以非常具体:

var token = root.Element(ns + "AssumeRoleWithWebIdentityResult")
                .Element(ns + "Credentials")
                .Element(ns + "SessionToken")
                .Value;

或者直接使用 Descendants:

var token = root.Descendants(ns + "SessionToken").Single().Value;

无论哪种方式,它都在使用命名空间,这是重要的部分。