添加带有前缀的开始元素,没有命名空间

Posted

技术标签:

【中文标题】添加带有前缀的开始元素,没有命名空间【英文标题】:Add start element with prefix without namespace 【发布时间】:2017-11-27 20:28:26 【问题描述】:

有没有办法像这样在 XmlWriter 中使用 WriteStartElement 函数:

XmlWriter.WriteStartElement("prefix", "name", null);

发生错误:System.ArgumentException:'无法使用前缀 空命名空间。'

我不想在创建元素时设置命名空间 URI。 稍后通过 WriteAttributeString() 添加它,当其他属性将被创建时。

【问题讨论】:

【参考方案1】:

不,未绑定到命名空间 URI 的命名空间前缀是没有意义的,并且不允许在 namespace-well-formed XML 文档中。

【讨论】:

【参考方案2】:

我不想在创建元素时设置命名空间 URI。稍后通过 WriteAttributeString() 添加它,当其他属性将被创建时。

前缀始终属于命名空间。通过定义一个非空命名空间,xmlns 属性将被自动创建:

writer.WriteStartElement("prefix", "localName", "ns"); // <prefix:localName xmlns:prefix="ns" />

【讨论】:

【参考方案3】:

我遇到了同样的问题,我正在寻找解决方案,最终,我意识到我应该使用我已经定义的相同命名空间。

我有这样的东西来创建元素:

xmlWriter.WriteStartElement("xhtml", "link", "xmlns");

结果是:

<?xml version="1.0" encoding="utf-8" ?>
<urlset xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>https://www.my-site.com/en/home</loc>
        <xhtml:link rel="alternative" hreflang="en" href="https://www.my-site.com/en/home" xmlns:xhtml="xmlns" />
        <xhtml:link rel="alternative" hreflang="ar" href="https://www.my-site.com/fr/home" xmlns:xhtml="xmlns" />
        <xhtml:link rel="alternative" hreflang="fa" href="https://www.my-site.com/fa/home" xmlns:xhtml="xmlns" />
    </url>
</urlset>

问题是我的 xhtml:link 元素正文中的 xmlns:xhtml="xmlns"

<xhtml:link rel="alternative" hreflang="en" href="https://www.my-site.com/en/home" xmlns:xhtml="xmlns" />

所以我将http://www.w3.org/1999/xhtml 改为命名空间或ns,如下所示:

xmlWriter.WriteStartElement("xhtml", "link", "http://www.w3.org/1999/xhtml");

现在它正是我所需要的:

<?xml version="1.0" encoding="utf-8" ?>
<urlset xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>https://www.my-site.com/en/home</loc>
        <xhtml:link rel="alternative" hreflang="en" href="https://www.my-site.com/en/home" />
        <xhtml:link rel="alternative" hreflang="ar" href="https://www.my-site.com/fr/home" />
        <xhtml:link rel="alternative" hreflang="fa" href="https://www.my-site.com/fa/home" />
    </url>
</urlset>

【讨论】:

很高兴您能够解决对WriteStartElement 参数的困惑,但您的问题不同:OP 的问题在于想要创建一个具有未定义命名空间前缀的元素,即在命名空间格式良好的 XML 中不允许;您的问题是您只是误解了 WriteStartElement() 的第三个参数的目的,但是一旦您纠正了错误,就可以将命名空间前缀绑定到命名空间。

以上是关于添加带有前缀的开始元素,没有命名空间的主要内容,如果未能解决你的问题,请参考以下文章

xsd:any 元素的命名空间前缀并使用 XSLT 添加命名空间前缀

删除带有命名空间前缀的 xmlns 属性

将命名空间前缀添加到根节点

jsonix - 如何创建一个有前缀但没有命名空间的元素?

重命名元素的 XSLT 问题——更改命名空间

将命名空间添加到根元素