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

The prefix “ cannot be redefined from ” to <url> within the same start element tag

提问人:user3858890 提问时间:10/2/2019 最后编辑:jdwenguser3858890 更新时间:9/25/2022 访问量:1447

问:

我正在创建一个XML文件,如下例所示,我尝试将第一个属性添加到标签中,但它给了我一个错误:xmlns<feed>

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">

以下是我尝试创建的完整 XML 文件的格式:

    <feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">
<title>Glowbox</title>
<link rel="self" href="https://glowbox.gr/"/>
<entry>
 <g:id>
  <![CDATA[ 4248 ]]>
 </g:id>
 <g:mpn>
  <![CDATA[ BLS054 ]]>
 </g:mpn>
 <g:title>
  <![CDATA[ Body Mist Summer Tales ]]>
 </g:title>
 <g:product_type/>
 <g:google_product_category>
  <![CDATA[ ]]>
 </g:google_product_category>
 <g:price>
  <![CDATA[ 13.5 EUR ]]>
 </g:price>
 <g:custom_label_1>
  <![CDATA[ no ]]>
 </g:custom_label_1>
 <g:image_link>
  <![CDATA[ https://glowbox.gr/7798/body-mist-summer-tales.jpg ]]>
 </g:image_link>
 <g:condition>new</g:condition>
 <g:link>
  <![CDATA[
   https://glowbox.gr/home/4248-body-mist-summer-tales.html
  ]]>
 </g:link>
 <g:description>
  <![CDATA[
  Aναζωογονητικό και ενυδατικό mist σώματος με εκχύλισμα αλόης και χαμομηλιού σε καταπληκτικά 
  αρώματα! 
  ]]>
 </g:description>
 <g:brand>
  <![CDATA[ BLUE SCENTS ]]>
 </g:brand>
 <g:availability>
  <![CDATA[ in stock ]]>
 </g:availability>
</entry>

我创建一个带有所有标签的类似 XML 文件的代码是这样的:

XDocument xdoc;
        XNamespace gw = "http://base.google.com/ns/1.0";
        xdoc = new XDocument(
                new XDeclaration("1.0", "", ""),
                new XElement("feed", new XAttribute("xmlns", "http://www.w3.org/2005/Atom"), new XAttribute(XNamespace.Xmlns + "g", "http://base.google.com/ns/1.0"),
                        new XElement("title", "Newcult"),
                        new XElement("link", new XAttribute("href", "http://www.newcult.gr"), new XAttribute("rel", "self")),
                            new XElement("entry",
                                new XElement(gw + "id", "<![CDATA[ 1 ]]>"),
                                new XElement(gw + "title", "2"),
                                new XElement(gw + "description", "3"),
                                new XElement(gw + "link", "4"),
                                new XElement(gw + "image_link", "5"),
                                new XElement(gw + "brand", "6"),
                                new XElement(gw + "gender", "7"),
                                new XElement(gw + "product_type", "8"),
                                new XElement(gw + "condition", "new"),
                                new XElement(gw + "availability", "in stock"),
                                new XElement(gw + "price", " EUR"),
                                new XElement(gw + "sale_price", " EUR"),
                                new XElement(gw + "google_product_category", "1")
                            )
                  )
                );

但是,当我运行它时,它给了我第一个标签的错误:attribute<feed>

前缀“cannot be redefined from”到“http://www.w3.org/2005/Atom”在同一起始元素标记中

我尝试更改 的顺序,或者稍后使用方法添加属性,但没有任何效果。attributes.Add()

关于如何解决此错误的任何想法? 谢谢!

C# asp.net XML 命名空间

评论


答:

1赞 jdweng 10/2/2019 #1

试着省去很多麻烦。试试这个:

           string header = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
                "<feed xmlns:gw=\"http://base.google.com/ns/1.0\" xmlns=\"http://www.w3.org/2005/Atom\" xmlns:g=\"http://base.google.com/ns/1.0\">" +
                "</feed>";


            XDocument xdoc = XDocument.Parse(header);
            XElement feed = xdoc.Root;
            XNamespace gw = feed.GetNamespaceOfPrefix("gw");
            XNamespace g = feed.GetNamespaceOfPrefix("g");
            XNamespace ns = feed.GetDefaultNamespace();

            feed.Add(new XElement(ns + "title", "Newcult" ),
                    new XElement(ns + "link", new object[] {
                        new XAttribute("href", "http://www.newcult.gr"), 
                        new XAttribute("rel", "self"),
                        new XElement(ns + "entry", new object[] {
                            new XElement(gw + "id", "<![CDATA[ 1 ]]>"),
                            new XElement(gw + "title", "2"),
                            new XElement(gw + "description", "3"),
                            new XElement(gw + "link", "4"),
                            new XElement(gw + "image_link", "5"),
                            new XElement(gw + "brand", "6"),
                            new XElement(gw + "gender", "7"),
                            new XElement(gw + "product_type", "8"),
                            new XElement(gw + "condition", "new"),
                            new XElement(gw + "availability", "in stock"),
                            new XElement(gw + "price", " EUR"),
                            new XElement(gw + "sale_price", " EUR"),
                            new XElement(gw + "google_product_category", "1")
                        })
                    })
             );

评论

0赞 user3858890 10/3/2019
谢谢你的回答!!您确实帮助我解决了我的问题,我确实修改了代码以实现我的目标,但现在有一个新问题。标签 ,现在有一个我不想要的属性。下面是 XML 输出。你能帮帮我吗?<entry>xmlns=""<entry xmlns=""> ... </entry>
0赞 jdweng 10/3/2019
网络库要求默认命名空间(没有前缀)是最后一个。当它不是原始代码中的最后一个时,我看到了异常问题。不确定此错误是否已在 Net 中修复。
0赞 Raphael 9/25/2022 #2

在更改 XElement 的命名空间后尝试序列化 XNode 时,也会发生此错误,例如通过设置删除它el

el.Name = XNamespace.None + el.Name.LocalName;

(如果 的命名空间是由属性定义的,例如 .)elxmlns="{uri}"<element xmlns="{uri}" />

在这种情况下,我发现的一个解决方案是同时删除 XAttribute 命名空间声明。

el.Attributes("xmlns").Remove();

(或类似,请注意,此附加行不会更改任何元素的实际命名空间,但它可能会更改命名空间在文档中的声明方式。

出现此问题似乎是因为 .Net XML 序列化程序“不够智能”,无法在某些情况下处理(更改的)命名空间,其中命名空间声明作为 XAttribute 显式存在(当 XNode 从包含命名空间声明的 XML 反序列化时,就是这种情况)。