簡體   English   中英

使用 SAX 解析 XML 並根據值僅獲取一個元素

[英]Parse XML using SAX and get only one element based on value

您好,我正在嘗試使用 SAX 解析 xml 文件並根據元素值對其進行過濾,並將結果保存在另一個文件中。

XML 文件示例:

<ruleset>
    <rule>
        <condition>
            <case1>String testing</case1>
            <allow>true</allow>
        </condition>
    </rule>
    <rule>
        <condition>
            <case2>String test</case2>
            <allow>false</allow>
        </condition>
    </rule>
</ruleset>

我希望結果文件如下

<ruleset>
    <rule>
        <condition>
            <case2>String test</case2>
            <allow>false</allow>
        </condition>
    </rule>
</ruleset>

由於標簽的值為“false”,所以我主要想根據元素的值過濾循環元素

到目前為止的代碼幫助我過濾基於父元素而不是元素的所有元素。

final String splitElement = "Rule";


        XMLReader xr = new XMLFilterImpl(XMLReaderFactory.createXMLReader()) {

            private boolean skip;

            public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes atts)
                    throws SAXException {

                if (qName.equals(splitElement)) {

                    super.startElement(uri, localName, qName, atts);
                    skip = false;
                    
                } else {
                    if (!skip) {
                        super.startElement(uri, localName, qName, atts);
                    }
                }
            }
            
            
            public void endElement(String uri, String localName, String qName) throws SAXException {
                if (!skip) {
                    super.endElement(uri, localName, qName);
                }
            }

            public void characters(char[] ch, int start, int length) throws SAXException {
                if (!skip) {
                    super.characters(ch, start, length);
                }
            }

        };

        Source src = new SAXSource(xr, new InputSource(
                "SourceFilePath"));
        StreamResult res = new StreamResult(new File(
                "DestinantionFilePath"));
        TransformerFactory.newInstance().newTransformer().transform(src, res);

是否可以使用 SAX 解析器來做到這一點,並且只保留具有 as false 的“規則”?

這並不容易,因為它需要先行 - 在一段時間后看到allow值之前,您無法決定如何處理rule開始標記。 最簡單的方法是開始為每個規則構建一個 DOM(或 DOM 類)樹,當您點擊rule結束標記時,決定是保留它還是丟棄它。

如果您想要使用 XSLT 3.0 解決此問題的流式解決方案,它是

<xsl:mode streamable="yes" on-no-match="shallow-copy"/>
<xsl:template match="rule">
  <xsl:sequence select="copy-of(.)[condition/allow='true']"/>
</xsl:template>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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