码迷,mamicode.com
首页 > 编程语言 > 详细

Java操作XML(4)--使用woodstox处理XML

时间:2021-01-28 11:39:34      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:sch   class   efi   filter   html   代码   rac   element   tin   

    Woodstox是一个快速、开源的StAX实现;被视为执行效果最佳的StAX实现之一。本文主要介绍使用Woodstox来理XML,文中所使用到的软件版本:Java 1.8.0_191、woodstox-core-asl 4.4.1。

1、引入依赖

<dependency>
    <groupId>org.codehaus.woodstox</groupId>
    <artifactId>woodstox-core-asl</artifactId>
    <version>4.4.1</version>
</dependency>

2、Java代码例子

该例子演示如何使用Woodstox来解析XML以及使用Woodstox来生成XML。

package com.abc.demo.general.xml;

import org.codehaus.stax2.*;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.xml.namespace.QName;
import javax.xml.stream.*;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.XMLEvent;

/**
 * 使用Woodstox处理xml
 */
public class WoodstoxCase {
    private static Logger logger = LoggerFactory.getLogger(WoodstoxCase.class);

    /**
     * 基于光标的方式解析xml
     * @throws Exception
     */
    @Test
    public void parse() throws Exception {
        XMLInputFactory2 factory = (XMLInputFactory2)XMLInputFactory2.newFactory();
        XMLStreamReader2 reader = (XMLStreamReader2)factory.createXMLStreamReader(WoodstoxCase.class.getResourceAsStream("student.xml"));
        //添加过滤器
        XMLStreamReader2 filterReader = (XMLStreamReader2)factory.createFilteredReader(reader, new StreamFilter() {
            @Override
            public boolean accept(XMLStreamReader reader) {
                //处理开始节点
                if (reader.isStartElement()) {
                    return true;
                }
                return false;
            }
        });

        while (filterReader.hasNext()) {
            int type = filterReader.next();
            if (type == XMLStreamReader.START_ELEMENT) {
                if ("student".equals(reader.getName().getLocalPart())) {
                    logger.info("rollno:" + reader.getAttributeValue("", "rollno"));
                } else if ("firstname".equals(reader.getName().getLocalPart())
                        || "lastname".equals(reader.getName().getLocalPart())
                        || "nickname".equals(reader.getName().getLocalPart())
                        || "marks".equals(reader.getName().getLocalPart())) {
                    logger.info(reader.getName().getLocalPart() + ":" + reader.getElementText());
                } else {
                    continue;
                }

            }
//            else if (type == XMLStreamReader.CHARACTERS){
//                logger.info(reader.getText());
//
//            } else if (type == XMLStreamReader.END_ELEMENT) {
//                logger.info("END_ELEMENT:</" + reader.getName().getLocalPart() + ">");
//            }
        }
    }

    /**
     * 基于迭代模型的方式解析xml
     * @throws Exception
     */
    @Test
    public void parse2() throws Exception {
        XMLInputFactory2 factory = (XMLInputFactory2)XMLInputFactory.newInstance();
        XMLEventReader2 reader = (XMLEventReader2)factory.createXMLEventReader(WoodstoxCase.class.getResourceAsStream("student.xml"));
        //添加过滤器
        XMLEventReader2 filterReader = (XMLEventReader2)factory.createFilteredReader(reader, event -> {
            //处理开始节点
            if (event.isStartElement()) {
                return true;
            }
            return false;
        });
        while (filterReader.hasNext()) {
            XMLEvent event = filterReader.nextEvent();
            if (event.isStartElement()) {
                if ("student".equals(event.asStartElement().getName().getLocalPart())) {
                    logger.info("rollno:" + event.asStartElement().getAttributeByName(new QName("", "rollno")).getValue());
                    Attribute attributeTestattr = event.asStartElement().getAttributeByName(new QName("http://www.w3.org/TR/html4/school/", "testattr"));
                    if (attributeTestattr != null) {
                        logger.info("testattr:" + attributeTestattr.getValue());
                    }
                } else if ("firstname".equals(event.asStartElement().getName().getLocalPart())
                        || "lastname".equals(event.asStartElement().getName().getLocalPart())
                        || "nickname".equals(event.asStartElement().getName().getLocalPart())
                        || "marks".equals(event.asStartElement().getName().getLocalPart())) {
                    logger.info(event.asStartElement().getName().getLocalPart() + ":" + filterReader.getElementText());
                } else {
                    continue;
                }

            }
        }
    }

    /**
     * 生成xml
     * @throws Exception
     */
    @Test
    public void toXml() throws Exception {
        XMLOutputFactory2 factory = (XMLOutputFactory2)XMLOutputFactory2.newInstance();
        XMLStreamWriter2 writer = (XMLStreamWriter2)factory.createXMLStreamWriter(System.out);

        writer.writeStartDocument("UTF-8", "1.0");
        writer.writeStartElement("school", "class", "http://www.w3.org/TR/html4/school/");

        //第一个学生
        writer.writeStartElement("school", "student", "http://www.w3.org/TR/html4/school/");
        writer.writeAttribute("rollno", "1");
        writer.writeAttribute("school","http://www.w3.org/TR/html4/school/", "testattr", "test");
        writer.writeStartElement("school", "firstname", "http://www.w3.org/TR/html4/school/");
        writer.writeCharacters("cxx1");
        writer.writeEndElement();
        writer.writeStartElement("lastname");
        writer.writeCharacters("Bob1");
        writer.writeEndElement();
        writer.writeStartElement("nickname");
        writer.writeCharacters("stars1");
        writer.writeEndElement();
        writer.writeStartElement("marks");
        writer.writeCharacters("85");
        writer.writeEndElement();
        writer.writeEndElement();

        //第二个学生
        writer.writeStartElement("student");
        writer.writeAttribute("rollno", "2");
        writer.writeStartElement("firstname");
        writer.writeCharacters("cxx2");
        writer.writeEndElement();
        writer.writeStartElement("lastname");
        writer.writeCharacters("Bob2");
        writer.writeEndElement();
        writer.writeStartElement("nickname");
        writer.writeCharacters("stars2");
        writer.writeEndElement();
        writer.writeStartElement("marks");
        writer.writeCharacters("85");
        writer.writeEndElement();
        writer.writeEndElement();

        //第三个学生
        writer.writeStartElement("student");
        writer.writeAttribute("rollno", "3");
        writer.writeStartElement("firstname");
        writer.writeCharacters("cxx3");
        writer.writeEndElement();
        writer.writeStartElement("lastname");
        writer.writeCharacters("Bob3");
        writer.writeEndElement();
        writer.writeStartElement("nickname");
        writer.writeCharacters("stars3");
        writer.writeEndElement();
        writer.writeStartElement("marks");
        writer.writeCharacters("85");
        writer.writeEndElement();
        writer.writeEndElement();

        writer.writeEndElement();
        writer.writeEndDocument();
    }
}

 

Java操作XML(4)--使用woodstox处理XML

标签:sch   class   efi   filter   html   代码   rac   element   tin   

原文地址:https://www.cnblogs.com/wuyongyin/p/14333642.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!