我正在尝试使用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
答案 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时出现此错误。经过大量的搜寻后,我发现了这篇文章:
在整个文档过程中碰巧有一种解释,我很幸运地发现了。
关键是您的代码应让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());
}