• Java 操作XML[方式三] (Stax JDK6引入)


    • Stax
      • Streaming API for XML
      • 流模型中的拉模型
      • 在遍历文档时, 会把感兴趣的部分从读取器中拉出, 不需要引发事件, 允许我们选择性地处理节点. 这大大提高了灵活性及整体效率.
      • 两套处理API
        • 基于指针的API, XMLStreamReader
        • 基于迭代器的API, XMLEventReader
    package hello;
    
    import javax.xml.stream.XMLInputFactory;
    import javax.xml.stream.XMLStreamConstants;
    import javax.xml.stream.XMLStreamException;
    import javax.xml.stream.XMLStreamReader;
    import javax.xml.stream.XMLEventReader;
    import javax.xml.stream.events.Attribute;
    import javax.xml.stream.events.EndElement;
    import javax.xml.stream.events.StartElement;
    import javax.xml.stream.events.XMLEvent;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.util.Iterator;
    import java.util.jar.Attributes;
    
    public class XML_STAXReader {
        public static void main(String[] args) {
    //        readByStream();
    //        readByEvent();
        }
    
        /**
         * 流模式
         */
        static void readByStream() {
            String xmlFile = "users.xml";
            XMLInputFactory factory = XMLInputFactory.newFactory();
            XMLStreamReader streamReader = null;
            try {
                streamReader = factory.createXMLStreamReader(new FileReader(xmlFile));
            } catch (FileNotFoundException | XMLStreamException e) {
                e.printStackTrace();
            }
    
            // 基于指针遍历
            try {
                assert streamReader != null;
                while (streamReader.hasNext()) {
                    int event = streamReader.next();
                    // 如果是元素的开始
                    if (event == XMLStreamConstants.START_ELEMENT) {
                        // 列出所有书籍名称
                        if ("name".equalsIgnoreCase(streamReader.getLocalName())) {
                            System.out.println("name: " + streamReader.getElementText());
                        }
                    }
                }
                streamReader.close();
            } catch (XMLStreamException e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 事件模式
         */
        static void readByEvent() {
            String xmlFile = "users.xml";
            XMLInputFactory factory = XMLInputFactory.newInstance();
            boolean nameFlag = false;
            try {
                // 创建基于迭代器的事件读取器对象
                XMLEventReader eventReader = factory.createXMLEventReader(new FileReader(xmlFile));
                // 遍历 Event 迭代器
                while (eventReader.hasNext()) {
                    XMLEvent event = eventReader.nextEvent();
                    // 如果事件对象是元素的开始
                    if (event.isStartElement()) {
                        // 转换成开始元素事件对象
                        StartElement start = event.asStartElement();
                        // 打印元素标签的本地名称
                        String name = start.getName().getLocalPart();
                        if (name.equals("name")) {
                            nameFlag = true;
                            System.out.println("name:");
                        }
                        // 取得所有属性
                        Iterator attrs = start.getAttributes();
                        while (attrs.hasNext()) {
                            // 打印所有属性信息
                            Attribute attr = (Attribute) attrs.next();
                            System.out.println(attr.getName().getLocalPart() + "=" + attr.getValue());
                        }
                    }
                    // 如果是正文
                    if (event.isCharacters()) {
                        String s = event.asCharacters().getData();
                        if (s != null && s.trim().length() > 0 && nameFlag) {
                            System.out.println(s.trim());
                        }
                    }
    
                    // 如果是事件对象的元素的结束
                    if (event.isEndElement()) {
                        EndElement end = event.asEndElement();
                        String name = end.getName().getLocalPart();
                        if (name.equals("name")) {
                            nameFlag = false;
                        }
                    }
                }
                eventReader.close();
            } catch (FileNotFoundException | XMLStreamException e) {
                e.printStackTrace();
            }
        }
    }
    
    <?xml version="1.0" encoding="UTF-8"?>
    <users>
        <user id="001">
            <name>Mary</name>
            <age>3</age>
            <sex>Female</sex>
        </user>
        <user id="002">
            <name>Mike</name>
            <age>18</age>
            <sex>Male</sex>
        </user>
        <user id="003">
            <name>ZhaZhaHui</name>
            <age>38</age>
            <sex>Male</sex>
        </user>
    </users>
    
  • 相关阅读:
    12.3、Libgdx的图像之截屏
    12.2、Libgdx的图像之清屏
    12.1、Libgdx的图像之持续性和非持续性渲染
    12、Libgdx的图像之全屏和垂直同步
    11.4、Libgdx的音频之录制PCM音效
    11.3、Libgdx的音频之播放PCM音频
    11.2、Libgdx的音频之音乐
    11.1、Libgdx的音频之音效
    11、Libgdx的音频
    阿里云服务器部署项目后台运行(入门)
  • 原文地址:https://www.cnblogs.com/sweetXiaoma/p/12658934.html
Copyright © 2020-2023  润新知