前缀 " 不能在同一起始元素标记内从 " 重新定义为 <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>的主要内容,如果未能解决你的问题,请参考以下文章