前缀 " 不能在同一起始元素标记内从 " 重新定义为 <url>

Posted

技术标签:

【中文标题】前缀 " 不能在同一起始元素标记内从 " 重新定义为 <url>【英文标题】:The prefix " cannot be redefined from " to <url> within the same start element tag 【发布时间】:2014-07-05 02:42:00 【问题描述】:

我正在尝试使用 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

【问题讨论】:

提示如果您找到了该问题的新答案,那么您应该使用适合您的修复程序来回答该问题,而不是仅仅编辑问题以说您有答案.除非这个问题实际上是另一个问题的重复,在这种情况下它应该被标记为这样,但它似乎不是一个完全重复的。 我在这里找到了解决这个问题的方法... [guyellisrocks.com/2009/03/….似乎我需要在定义 XDoc 时定义默认命名空间。 HTH。 【参考方案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 变量,并在定义 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());
    

【讨论】:

以上是关于前缀 " 不能在同一起始元素标记内从 " 重新定义为 <url>的主要内容,如果未能解决你的问题,请参考以下文章

如何在纯 PHP 中获取起始 HTML 标记?

在HTML代码中,超链接元素的标记是啥?

JS怎么只用一个循环给页面多个元素赋值

Bailian2797 最短前缀字典树

OEM sql monitor 报错java.sql.SQLException: ORA-31011

GXU - 7D - 区间求和 - 前缀和