Java XML转换器节点转字符串移除命名空间

3
我使用以下方法将XML节点转换为String(通常在网络上找到):
String nodeToString(Node node) {
   StringWriter sw = new StringWriter();
   try {
      Transformer t = TransformerFactory.newInstance().newTransformer();
      t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
      t.setOutputProperty(OutputKeys.INDENT, "yes");
      t.transform(new DOMSource(node), new StreamResult(sw));
   } catch (TransformerException te) {
     throw ...
   }
   return sw.toString();
}

Node 转换为字符串后不是整个 XML 文档,而只是更大的 XML 的一部分。 问题在于转换为字符串后,Node 的根元素会添加一个 xmlns,这会导致问题。

这是 nodeToString 返回的字符串:

<doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <header>
         ...
     </header>
     <payload>
         ...
     </payload>
</doc> 

最糟糕的是,这种情况只发生在UAT环境中,而不是我的机器和测试环境上,我很难找到两个环境之间的区别。

有没有人遇到过这个问题并知道是什么原因引起的?

编辑:

原始文档如下:

<docs>
    <doc> 
         <header>
             ...
         </header>
         <payload>
             ...
         </payload>
    </doc>  
    <doc> 
         <header>
             ...
         </header>
         <payload>
             ...
         </payload>
    </doc>   
    // more <doc>s
<docs>  

这段代码使用XPath将文本拆分为节点(每个节点都是一个元素),然后应用一些业务逻辑(删除某些节点,以不同方式对其进行分组),最终需要将其转换回字符串格式。


你能展示一下原始输入的XML示例吗? - OldProgrammer
@OldProgrammer 好的,问题已编辑。 - Evgeni Dimitrov
1个回答

1
假设xsi命名空间实际上是在某个祖先元素上声明的,那么这就是正确的行为,尽管这可能对您有问题。在XSLT(以及JAXP身份转换器)使用的XDM数据模型中,一个元素对于在该元素或其任何祖先上声明的每个命名空间都有一个作用域内命名空间声明,并且在序列化元素时,所有非冗余的作用域内命名空间声明都会输出。原因是某些元素或属性可能实际上使用了声明的命名空间前缀(这在XSLT和XSD中很常见,但在其他XML词汇中很少见)。您可以通过在序列化之前进行转换(使用XSLT 2.0+,只需执行即可)来摆脱不需要的命名空间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接