当前位置: 首页 > 面试题库 >

用sax跳过节点

邹英悟
2023-03-14
问题内容

解析时是否可以跳过节点,这skippedEntity与它有什么关系?

考虑以下XML:

<?xml version="1.0"?>

<nutrition>

<daily-values>
    <total-fat units="g">65</total-fat>
    <saturated-fat units="g">20</saturated-fat>
    <cholesterol units="mg">300</cholesterol>
    <sodium units="mg">2400</sodium>
    <carb units="g">300</carb>
    <fiber units="g">25</fiber>
    <protein units="g">50</protein>
</daily-values>

</nutrition>

我想跳过“钠”元素


问题答案:

您可以执行以下操作:

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.XMLReader;

public class Demo {

    public static void main(String[] args) throws Exception {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(new MyContentHandler(xr));
        xr.parse("input.xml");
    }
}

MyContentHandler

此类负责处理您的XML文档。击中要忽略的节点时,可以在IgnoringContentHandler中进行交换,这将吞噬该节点的所有事件。

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class MyContentHandler extends DefaultHandler {

    private XMLReader xmlReader;

    public MyContentHandler(XMLReader xmlReader) {
        this.xmlReader = xmlReader;
    }

    public void startElement(String uri, String localName, String qName,
            Attributes atts) throws SAXException {
        if ("sodium".equals(qName)) {
            xmlReader.setContentHandler(new IgnoringContentHandler(xmlReader,
                    this));
        } else {
            System.out.println("START " + qName);
        }
    }

    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        System.out.println("END " + qName);
    }

    public void characters(char[] ch, int start, int length)
            throws SAXException {
        System.out.println(new String(ch, start, length));
    }

}

忽略ContentHandler

当IgnoringContentHandler完成吞咽事件后,它将控制权传递回您的主ContentHandler。

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class IgnoringContentHandler extends DefaultHandler {

    private int depth = 1;
    private XMLReader xmlReader;
    private ContentHandler contentHandler;

    public IgnoringContentHandler(XMLReader xmlReader, ContentHandler contentHandler) {
        this.contentHandler = contentHandler;
        this.xmlReader = xmlReader;
    }

    public void startElement(String uri, String localName, String qName,
            Attributes atts) throws SAXException {
        depth++;
    }

    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        depth--;
        if(0 == depth) {
           xmlReader.setContentHandler(contentHandler);
        }
    }

}


 类似资料:
  • 问题内容: 所以,我有一个像 所以,我有一个条件说如果ts =“ 2”然后做某事…现在的问题是,当它找到ts =“ 1”时,它仍然扫描标签 ,然后到达 当条件与解析中断不匹配并直接寻找下一个事务标记时,是否有办法? 问题答案: SAX解析器必须扫描所有子树(例如“ ”)以知道下一个元素的起始位置。无法解决它,这也是为什么您不能为单个XML文档并行化XML Parser的原因。 在您的情况下,我可以

  • 我可以使用以下方法获取第一个

  • SAX(Simple API for XML)是一种基于事件的XML文档解析器。 与DOM解析器不同,SAX解析器不会创建解析树。 SAX是XML的流式接口,这意味着使用SAX的应用程序接收有关正在处理的XML文档的事件通知元素和属性,从文档顶部开始按顺序排列,然后关闭ROOT元素。 从上到下读取XML文档,识别构成格式良好的XML文档的标记。 令牌的处理顺序与它们在文档中出现的顺序相同。 向应用

  • SAX(Simple API for XML)是一个基于事件的xml文档解析器。 与DOM解析器不同,SAX解析器不会创建解析树。 SAX是XML的流式接口,这意味着使用SAX的应用程序接收有关正在处理的XML文档的事件通知 - 元素和属性,从文档顶部开始按顺序排列,并以关闭为止ROOT元素。 从上到下读取XML文档,识别构成格式良好的XML文档的标记。 令牌的处理顺序与文档中出现的顺序相同。 报

  • 部门:AILab - 机器人 - 后台开发 投递:官网 一面 23.5.10 问项目 介绍(务必练习出有引导有重点的介绍!) 难点 token怎么实现 计网 TCP和UDP的区别 为什么三次握手 WebSockt http1.0 / 1.1 / 2 / 3 MySQL 有哪些引擎 InnoDB和MyISAM的区别 区别 隔离级别 最左前缀原则 操作系统 分段和分页的区别 进程通信 C++ 友元fr

  • 问题内容: 我正在尝试读取一个大型XML文档,我想以分块的方式进行,而不是将整个文件读入内存的方式。我知道我可以使用它来执行此操作,但我想知道是否有人将SAX用于.NET?我知道Java开发人员对此很满意,我想知道是否值得尝试一下,如果可以的话使用它有什么好处。我正在寻找细节。 问题答案: 如果您在谈论.NET的SAX,则该项目似乎没有得到维护。最新版本是2年前。也许他们在上一个版本中做到了完美,