3

以下に示すように、ClaimTypesOffered 要素にさらにクレームを追加しようとしています。

<fed:ClaimTypesOffered>
  <auth:ClaimType Uri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" Optional="true" xmlns:auth="http://docs.oasis-open.org/wsfed/authorization/200706">
    <auth:DisplayName>Name</auth:DisplayName>
    <auth:Description>The name of the subject.</auth:Description>
  </auth:ClaimType>
</fed:ClaimTypesOffered>

そこでは多くの名前空間の魔法が行われており、私はそれをうまく処理しようとしています。適切な要素名を取得するだけでも困難です。私は次のすべてを試しました:

new XElement(XNamespace.Get("auth") + "ClaimType", "somedata");

与える

<ClaimType xmlns="auth">somedata</ClaimType>

new XElement(XName.Get("{http://docs.oasis-open.org/wsfed/authorization/200706}auth"), "somedata");

与える

<auth xmlns="http://docs.oasis-open.org/wsfed/authorization/200706">somedata</auth>

new XElement("auth:ClaimType", "somedata");

与える

System.Xml.XmlException : The ':' character, hexadecimal value 0x3A, cannot be included in a name.

これをさらに進めるための助けを探しています。属性と内部要素を含むクレームを生成する完全な例は素晴らしいでしょう。正しい方向への小さなプッシュでもありがたいです。

4

1 に答える 1

0

重要なのは、親要素の名前空間を定義することです。その後、子要素はその名前空間を使用できます。新しい XAttribute(XNamespace.Xmlns + "auth", auth.NamespaceName)がなければ、元の質問に見られるように、名前空間は他の方法で定義されます。

        XNamespace fed = "http://docs.oasis-open.org/wsfed/federation/200706";
        XNamespace auth = "http://docs.oasis-open.org/wsfed/authorization/200706";

        XElement root = new XElement(auth + "ClaimType",
            new XAttribute(XNamespace.Xmlns + "auth", auth.NamespaceName),
            new XAttribute("Uri", "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"),
            new XAttribute("Optional", "true"),
            new XElement(auth+"DisplayName", "EmployeeID"),
            new XElement(auth+"Description", "The employee's designated ID number.")
        );

        Console.WriteLine(root);
于 2012-09-03T20:06:11.647 に答える