使用sax和java从xml文件中删除多个节点

我是使用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>

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念