C# 合并 xml 中的命名空间引用

发布于 09-12 13:41 字数 397 浏览 9 评论 0原文

我有由atom 格式化程序格式化的xml。 原子格式化程序似乎多次指定内联命名空间。

有什么办法可以轻松整合这些。 下面的示例显示了为每个属性指定了三次的命名空间。 这太可怕了。

我希望文档顶部有前缀,并且文档中没有命名空间(只是前缀)。是否有编写器或格式化程序选项可以实现此目的?

<property p3:name="firstname" xmlns:p3="http://a9.com/-/opensearch/extensions/property/1.0/" xmlns="http://a9.com/-/opensearch/extensions/property/1.0/">Drikie</property>

谢谢克雷格

I have xml formatted by the atom formatter.
The atom formatter seems to specify namespaces inline multiple times.

Is there any way to easily consolidate these.
The example below shows namespaces specified three times for each property.
This is horrible.

I would like prefixes at the top of the document and no namespaces in the document (just prefixes). Is there a writer or formatter option to achieve this?

<property p3:name="firstname" xmlns:p3="http://a9.com/-/opensearch/extensions/property/1.0/" xmlns="http://a9.com/-/opensearch/extensions/property/1.0/">Drikie</property>

Thanks

Craig.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

败给现实2024-09-19 13:41:52

原子格式化程序似乎指定
命名空间内联多次。

有什么办法可以轻松整合
这些。下面的例子显示
指定了三次的命名空间
每个属性。这太可怕了。

生成这种更紧凑格式的最简单方法是在 XML 文档上应用以下 XSLT 转换

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()[not(self::*)]|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="*">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
   <xsl:copy-of select="descendant::*/namespace::*"/>
   <xsl:copy-of select="namespace::*"/>

   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

例如,当应用于以下 XML 文档时(根据您的问题):

<t xmlns="http://a9.com/-/opensearch/extensions/property/1.0/">
<property p3:name="firstname"
  xmlns:p3="http://a9.com/-/opensearch/extensions/property/1.0/"
  xmlns="http://a9.com/-/opensearch/extensions/property/1.0/"
  >Drikie</property>
</t>

产生了想要的结果:

<t
 xmlns="http://a9.com/-/opensearch/extensions/property/1.0/"
 xmlns:p3="http://a9.com/-/opensearch/extensions/property/1.0/">
    <property p3:name="firstname">Drikie</property>
</t>

请注意:

  1. 命名空间声明不能进一步提升到具有绑定相同前缀的声明的元素之上到另一个命名空间

  2. 将命名空间声明提升到祖先元素可能会增加解析的 XML 文档的大小,因为所有命名空间节点都会向下传播到所有后代节点,其中一些节点可能根本不需要该命名空间.

The atom formatter seems to specify
namespaces inline multiple times.

Is there any way to easily consolidate
these. The example below shows
namespaces specified three times for
each property. This is horrible.

The easiest way to produce this more compact format is to apply the following XSLT transformation on your XML document:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()[not(self::*)]|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="*">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
   <xsl:copy-of select="descendant::*/namespace::*"/>
   <xsl:copy-of select="namespace::*"/>

   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

For example, when applied on the following XML document (based on your question):

<t xmlns="http://a9.com/-/opensearch/extensions/property/1.0/">
<property p3:name="firstname"
  xmlns:p3="http://a9.com/-/opensearch/extensions/property/1.0/"
  xmlns="http://a9.com/-/opensearch/extensions/property/1.0/"
  >Drikie</property>
</t>

the wanted result is produced:

<t
 xmlns="http://a9.com/-/opensearch/extensions/property/1.0/"
 xmlns:p3="http://a9.com/-/opensearch/extensions/property/1.0/">
    <property p3:name="firstname">Drikie</property>
</t>

Do note:

  1. A namespace declaration cannot be promoted further above an element that has a declaration that binds the same prefix to another namespace.

  2. Promoting a namespace declaration to an ancestor element may increase the size of the parsed XML document, because all namespace nodes are propagated down to all descendent nodes, some of which may not need at all that namespace.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文