Подтвердить что ты не робот

Префикс "не может быть переопределен от" до <url> внутри одного и того же тега элемента запуска

Я пытаюсь создать следующий элемент 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">

Проблема в том, что я получаю исключение:

Префикс "не может быть переопределен с" внутри одного тега начального элемента.

Это мой код С#:

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

4b9b3361

Ответ 1

Необходимо указать, что элемент 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")
    );

Ответ 2

Я получаю эту ошибку при создании 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 и использовать эту переменную XNamespace при определении XElement. Это эффективно добавит 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());
    }