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



>遗留代码正在使用DOM解析器来解析一个非常大的XML文件。

工作流程: 1. 从文档中清理命名空间。 document.accept(new NameSpaceCleaner(((;这是命名空间清理器类。最后一堂课 NameSpaceCleaner 扩展了访客支持 { @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 解析器清理命名空间。

我不是 100% 确定你的代码在做什么:类 DefaultElement 似乎是 Xerces 内部的东西,我不知道你的测试"DefaultElement 的节点实例"何时成功。我假设它正在测试节点是否在默认命名空间中,并且您正在尝试将默认命名空间中的所有节点移动到没有命名空间中。

我不打算为您提供 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>

最新更新