如何使用java dom从xml中删除命名空间?

Gra*_*min 13 java xml dom xml-namespaces domdocument

我有以下代码

DocumentBuilderFactory dbFactory_ = DocumentBuilderFactory.newInstance();
Document doc_;
DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder();
StringReader reader = new StringReader(s);
InputSource inputSource = new InputSource(reader);
doc_ = dBuilder.parse(inputSource);
doc_.getDocumentElement().normalize();
Run Code Online (Sandbox Code Playgroud)

然后我就能做到

doc_.getDocumentElement();
Run Code Online (Sandbox Code Playgroud)

得到我的第一个元素,但问题是而不是job元素是tns:job.

我知道并试图使用:

dbFactory_.setNamespaceAware(true);
Run Code Online (Sandbox Code Playgroud)

但这不是我正在寻找的东西,我需要一些东西来完全摆脱命名空间.

任何帮助将不胜感激,谢谢,

玩笑

小智 11

使用正则表达式功能.这将解决此问题:

public static String removeXmlStringNamespaceAndPreamble(String xmlString) {
  return xmlString.replaceAll("(<\\?[^<]*\\?>)?", ""). /* remove preamble */
  replaceAll("xmlns.*?(\"|\').*?(\"|\')", "") /* remove xmlns declaration */
  .replaceAll("(<)(\\w+:)(.*?>)", "$1$3") /* remove opening tag prefix */
  .replaceAll("(</)(\\w+:)(.*?>)", "$1$3"); /* remove closing tags prefix */
}
Run Code Online (Sandbox Code Playgroud)

  • 即使此代码有效,使用正则表达式删除所有名称空间也不是一件好事. (20认同)

Tom*_*lak 8

如果绝对必须这样做,您可以预处理 XML 以删除所有名称空间。我建议不要这样做,因为从 XML 文档中删除命名空间本质上与从编程框架或库中删除命名空间相当 - 您可能会面临名称冲突的风险,并失去区分曾经不同的元素的能力。然而,这是你的葬礼。;-)

此 XSLT 转换会从任何 XML 文档中删除所有名称空间。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="node()">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="node()|@*" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="@*">
    <xsl:attribute name="{local-name()}">
      <xsl:apply-templates select="node()|@*" />
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

将其应用到您的 XML 文档。即使在这个网站上,执行此类操作的 Java 示例也应该很多。生成的文档将具有完全相同的结构和布局,只是没有名称空间。


rob*_*x44 6

对于元素和属性节点:

Node node = ...;
String name = node.getLocalName();
Run Code Online (Sandbox Code Playgroud)

将为您提供节点名称的本地部分。

Node.getLocalName()

  • 正如 Anon 和 Tomalak 所提到的,您真的不想从 XML 中剥离名称空间信息。对于您的特定情况,这是一个很好的解决方法,但我会保留名称空间信息不变。 (2认同)