将XML从DOM解析器解析为SAX解析器

时间:2019-09-16 18:18:17

标签: xml dom namespaces sax

旧版代码正在使用DOM解析器来解析很大的XML文件。

工作流程: 1.从文档中清理名称空间。 document.accept(new NameSpaceCleaner()); 这是名称空间清洁器类。 最后一个类NameSpaceCleaner扩展了VisitorSupport {     @Override     公开访问(文件文件)     {
        ((DefaultElement)document.getRootElement())。setNamespace(Namespace.NO_NAMESPACE);         document.getRootElement()。additionalNamespaces()。clear();     }

@Override
public void visit(Attribute node)
{
     if (node.toString().contains("xmlns") || node.toString().contains("xsi:")) {
        node.detach();
    }
}

@Override
public void visit(Element node)
{
    if (node instanceof DefaultElement) {
        ((DefaultElement) node).setNamespace(Namespace.NO_NAMESPACE);
    }
}

不确定如何使用SAX解析器清理名称空间。

1 个答案:

答案 0 :(得分:0)

我不是100%地确定您的代码在做什么:DefaultElement类似乎是Xerces内部的事情,我不知道您的测试“ DefaultInstance的节点实例”何时成功通过。我假设它正在测试该节点是否在默认名称空间中,并且您正在尝试将默认名称空间中的所有节点都移到无名称空间中。

我不会为您提供SAX解决方案,因为我没有时间或精力编写这样的低级代码,但是如果您想使用XSLT 3.0流进行处理,那么它是:

<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xsl:mode streamable="yes"/>

  <xsl:template match="*[namespace-uri()='']">
    <xsl:element name="{local-name()}">
      <xsl:copy-of select="@* except @xsi:*"/>
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="*[namespace-uri()!='']">
    <xsl:copy copy-namespaces="no">
      <xsl:copy-of select="@* except @xsi:*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

</xsl:transform>