缺少命名空间的前缀xml元素
问题描述:
我正在接收一些预生成的xml文档作为字符串,我需要为所有缺少前缀的xml元素添加前缀。例如缺少命名空间的前缀xml元素
输入:
<a xmlns:b="http://www.b.com">
<element1>test</element1>
<b:element2>test</b:element2>
</a>
输出:
<c:a xmlns:b="http://www.b.com" c="http://www.c.com">
<c:element1>test</c:element1>
<b:element2>test</b:element2>
</c:a>
我已经将文档解析成一个节点,但我想不出如何添加前缀到缺少任何元素一个前缀。我打算回归一些正则表达式替换字符串,但我认为这应该是可能的java xml api,我只是卡住了。
答
以下XSLT 1.0转换将所有无名称空间元素移动到名称空间前缀=“c”,uri =“http://www.c.com”。
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*[namespace-uri()='']">
<xsl:element name="c:{local-name()}" namespace="http://www.c.com">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:transform>
答
虽然迈克尔的回答肯定是“正确”的方式做到这一点,如果你想不XSLT手头的XML一个简单的解决方案,你可以仅仅通过更换<a xmlns="http://www.c.com" xmlns:b="http://www.b.com">
<a xmlns:b="http://www.b.com">
。这引入了http://www.c.com
作为默认命名空间,以明确地分配给没有命名空间前缀的任何元素。但请注意,这不像迈克尔的解决方案那样通用。
如果你不想在串级来操作XML,你可以解析和使用Java的XMLStreamWriter
类重写XML为好,例如,特别是setDefaultNamespace()
和writeDefaultNamespace()
方法。