前缀&#34;无法从&#34;重新定义到同一个开始元素标记</url>中的<url>

时间:2014-05-16 15:11:26

标签: c# xml xml-namespaces

我正在尝试使用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消息的主体发送,我需要它以接收器的这种格式。

编辑:我在另一个问题上找到了答案。 Controlling the order of XML namepaces

2 个答案:

答案 0 :(得分:25)

您需要指明元素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")
    );

答案 1 :(得分:0)

创建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());
    }