前缀缺少命名空间的xml元素

时间:2017-09-14 04:49:32

标签: java xml namespaces

我收到一些预生成的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>

我将文档解析为Node,但我无法想象如何为缺少前缀的任何元素添加前缀。我打算退回一些正则表达式字符串替换,但我认为这应该可以使用java xml api,我只是卡住了。

2 个答案:

答案 0 :(得分:0)

以下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>

答案 1 :(得分:0)

虽然迈克尔的回答肯定是“正确的”#34;要做到这一点,如果你想要一个没有XSLT的更简单的解决方案,那么你可以用<a xmlns:b="http://www.b.com">替换<a xmlns="http://www.c.com" xmlns:b="http://www.b.com">。这引入了http://www.c.com作为默认名称空间,分配给任何明确没有名称空间前缀的元素。但请注意,这并不像迈克尔的解决方案那样通用。

如果您不想在字符串级别操作XML,您也可以解析和重写XML,例如使用Java的XMLStreamWriter类,尤其是{{ 1}}和setDefaultNamespace()方法。