web-dev-qa-db-ja.com

同じ開始要素タグ内で、接頭辞 "を"から<url>に再定義することはできません

C#を使用して次のxml要素を生成しようとしています。

<Foo xmlns="http://schemas.foo.com" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://schemas.foo.com
 http://schemas.foo.com/Current/xsd/Foo.xsd">

私が抱えている問題は、例外が発生することです。

接頭辞 "を"から同じ開始要素タグ内に再定義することはできません。

これは私のc#コードです:

XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XElement foo = new XElement("Foo", new XAttribute("xmlns", "http://schemas.foo.com"),
                                   new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
                                   new XAttribute(xsi + "schemaLocation", "http://schemas.foo.com http://schemas.foo.com/Current/xsd/Foo.xsd"));

どうすれば修正できますか?生成されたxmlをSOAPメッセージの本文として送信しようとしています。受信者用にこの形式にする必要があります。

編集:別の質問で自分の答えが見つかりました。 XML名前空間の順序の制御

34
Rainbacon

要素Fooが名前空間http://schemas.foo.comの一部であることを示す必要があります。これを試して:

XNamespace xNamespace = "http://schemas.foo.com";    
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XElement foo = new XElement(
    xNamespace + "Foo", 
    new XAttribute("xmlns", "http://schemas.foo.com"),
    new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
    new XAttribute(xsi + "schemaLocation", "http://schemas.foo.com http://schemas.foo.com/Current/xsd/Foo.xsd")
    );
30
Jose M.

XDocumentの作成時にこのエラーが発生しました。多くのグーグル検索の後、私はこの記事を見つけました:

http://www.mikesdotnetting.com/Article/111/RSS-Feeds-and-Google-Sitemaps-for-ASP.NET-MVC-with-LINQ-To-XML

たまたま、ドキュメントの途中に説明があったので、幸運にもそれを見つけることができました。

重要な点は、コードでXDocumentがxmlns属性を処理できるようにすることです。 XElementを作成するときの最初の本能は、属性 "xmlns"を追加して値に設定することにより、他のすべてと同様に名前空間属性を設定することです。

代わりに、XNamespace変数を作成し、XElementを定義するときにそのXNamespace変数を使用する必要があります。これにより、XAttributeが要素に効果的に追加されます。

自分でxmlns属性を追加するときは、XElement作成ルーチンに、名前空間なしでXElementを作成してから、予約済みのxmlns属性を使用して名前空間を変更するように指示しています。あなたは自分と矛盾しています。エラーには、「名前空間を空に設定してから、同じタグ内の別の名前空間に再度設定することはできません。数値」と表示されます。

以下の関数はこれを示しています...

    private static void Test_Namespace_Error(bool doAnError)
    {
        XDocument xDoc = new XDocument();
        string ns = "http://mynamespace.com";
        XElement xEl = null;
        if (doAnError)
        {
            // WRONG: This creates an element with no namespace and then changes the namespace
            xEl = new XElement("tagName", new XAttribute("xmlns", ns));
        }
        else
        {
            // RIGHT: This creates an element in a namespace, and implicitly adds an xmlns tag
            XNamespace xNs = ns;
            xEl = new XElement(xNs + "tagName");
        }

        xDoc.Add(xEl);
        Console.WriteLine(xDoc.ToString());
    }
4
Steve Hibbert