有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为缺少命名空间的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>

我将文档解析为一个节点,但我不知道如何为任何缺少前缀的元素添加前缀。我本来打算用一些正则表达式字符串替换,但我认为这在JavaXMLAPI中应该是可能的,我只是被卡住了


共 (2) 个答案

  1. # 1 楼答案

    下面的XSLT 1.0转换将把所有无名称空间元素移动到前缀为“c”、uri为“c”的名称空间中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>
    
  2. # 2 楼答案

    虽然Michael的答案肯定是一种“正确”的方法,但如果您想要一个更简单的解决方案,而不使用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作为默认名称空间,以分配给任何没有显式名称空间前缀的元素。不过请注意,这并不像Michael的解决方案那样通用

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