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

标签 java xml sax

我不熟悉使用 Java 和 SAX 解析器进行 XML 解析。我有一个非常大的 XML 文件,由于它的大小,我被建议使用 SAX 解析器。我已经完成了部分任务的解析,并且按预期工作。现在,XML 作业只剩下一项任务:根据用户请求删除/更新一些节点。

我能够通过名称找到所有标签,更改它们的 data 属性等。如果我能够使用 SAX 执行这些操作,删除也是可能的。

示例 XML 描述了某些情况下的某些功能。用户的输入是“案例”的名称(case1case2)。

<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 标签,则必须删除完整的 rule 标签.如果要删除 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>

关于java - 使用 sax 和 java 从 xml 文件中删除多个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13847454/

相关文章:

java - 为什么 g2d.rotate 到 90 度不完全是 90 度? JAVA

java - 如何强制 JVM 清除 WeakHashMap 的所有 WeakReferences/keys

java - 使用 SAX 解析具有未知数量递归的 XML 结构

java - Java SAX 的严重性能问题

java - 使用cmd命令运行类文件

java - 如何对 HashMap<Integer, ArrayList<String>> 中的数组列表进行排序

xml - 将 xml 转换为键值对表示法

安卓形状 : Circle with cross(plus)

xml - XSL 浏览器问题

java - 解析 XML 文件中特定标签的内容 (Java)