我是使用Java和SAX解析器进行XML解析的新手.我有一个非常大的XML文件,因为它的大小我被建议使用SAX解析器.我已经完成了部分任务的解析,它按预期工作.现在,XML作业还剩下一个任务:根据用户的请求删除/更新一些节点.
我可以通过名称找到所有标签,更改其数据属性等.如果我能够使用SAX执行这些操作,也可以删除.
示例XML描述了某些情况下的一些功能.用户的输入是“case”的名称(case1,case2).
<ruleset>
<rule id="1">
<condition>
<case1>somefunctionality</case1>
<allow>true</allow>
</condition>
</rule>
<rule id="2">
<condition>
<case2>somefunctionality</case2>
<allow>false</allow>
</condition>
</rule>
</ruleset>
如果用户想要删除其中一种情况(例如case1)而不仅仅是case1标记,则必须删除完整的规则标记.如果要删除case1,XML将变为:
<ruleset>
<rule id="2">
<condition>
<case2>somefunctionality</case2>
<allow>false</allow>
</condition>
</rule>
</ruleset>
我的问题是,这可以使用SAX完成吗?此时我无法使用DOM或任何其他解析器.只有其他选择更糟糕:字符串搜索.如何使用SaxParser完成?
解决方法:
试试吧
XMLReader xr = new XMLFilterImpl(XMLReaderFactory.createXMLReader()) {
private boolean skip;
@Override
public void startElement(String uri, String localName, String qName, Attributes atts)
throws SAXException {
if (qName.equals("rule")) {
if (atts.getValue("id").equals("1")) {
skip = true;
} else {
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);
}
}
@Override
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("test.xml"));
Result res = new StreamResult(System.out);
TransformerFactory.newInstance().newTransformer().transform(src, res);
产量
<?xml version="1.0" encoding="UTF-8"?><ruleset>
<rule id="2">
<condition>
<case2>somefunctionality</case2>
<allow>false</allow>
</condition>
</rule>
</ruleset>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。