缺少命名空间的前缀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()方法。