旧版代码正在使用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解析器清理名称空间。
答案 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>