[英]Refactoring parsing the XML from DOM parser to SAX parser
舊版代碼正在使用DOM解析器來解析非常大的XML文件。
工作流程:1.從文檔中清理名稱空間。 document.accept(new NameSpaceCleaner()); 這是名稱空間清潔器類。 最后一個類NameSpaceCleaner擴展了VisitorSupport {@Override public void visit(Document document){
((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內部的事情,我不知道您的測試“ 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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.