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