簡體   English   中英

將XML從DOM解析器解析為SAX解析器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM