Java Stax操作XMLの概要


staxを使用してxmlを操作するのは非常に簡単で、その読み取りプロセスはカーソルが移動しているようです.異なるノードに対して異なる処理を行う.まず、カーソルベースのモデル処理xmlを見てみましょう.
public class StaxTest {

    @Test
    public void test1() {
        try {
            // 1.  XMLStreamReader
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLStreamReader reader = factory
                    .createXMLStreamReader(StaxTest.class
                            .getResourceAsStream("books.xml"));
            while (reader.hasNext()) {
                int type = reader.next();
                //       ,      <>
                if(type==XMLStreamReader.START_ELEMENT){
                    System.out.println("<"+reader.getName()+">");
                    //       ,              
                }else if(type==XMLStreamReader.CHARACTERS){
                    System.out.println(reader.getText());
                    //       ,      </>
                }else if(type==XMLStreamReader.END_ELEMENT){
                    System.out.println("</"+reader.getName()+">");
                }
            }
        } catch (FactoryConfigurationError | XMLStreamException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test2() {
        try {
            // 1.  XMLStreamReader
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLStreamReader reader = factory
                    .createXMLStreamReader(StaxTest.class
                            .getResourceAsStream("books.xml"));
            while (reader.hasNext()) {
                int type = reader.next();
                //    book     ,0        
                if(type==XMLStreamReader.START_ELEMENT){
                    if (reader.getName().toString().equals("book")) {
                        System.out.println(reader.getAttributeName(0) + ":"
                                + reader.getAttributeValue(0));
                    }
                }
            }
        } catch (FactoryConfigurationError | XMLStreamException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test3() {
        try {
            // 1.  XMLStreamReader
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLStreamReader reader = factory
                    .createXMLStreamReader(StaxTest.class
                            .getResourceAsStream("books.xml"));
            while (reader.hasNext()) {
                int type = reader.next();
                //           ,
                if(type==XMLStreamReader.START_ELEMENT){
                    if (reader.getName().toString().equals("name")) {
                        System.out.print(reader.getName()+":"+reader.getElementText());
                    }
                    if (reader.getName().toString().equals("price")) {
                        System.out.println(reader.getName()+":"+reader.getElementText());
                    }
                }
            }
        } catch (FactoryConfigurationError | XMLStreamException e) {
            e.printStackTrace();
        }
    }
}
<books>
    <book category="    " edition="8">
        <id>1</id>
        <name>Java    </name>
        <price>80</price>
        <author>  </author>
        <detail>
             <pressTime>  </pressTime>
             <storyTime>21  </storyTime>
        </detail>
    </book>
    <book category="    " edition="1">
        <id>2</id>
        <name>    </name>
        <price>30</price>
        <author>   </author>
        <detail>
             <pressTime>  </pressTime>
             <storyTime>  </storyTime>
        </detail>
    </book>
    <book category="  " edition="2">
        <id>3</id>
        <name>   </name>
        <price>35</price>
        <author>   </author>
        <detail>
             <pressTime>  </pressTime>
             <storyTime>  </storyTime>
        </detail>
    </book>
    <book category="    " edition="4">
        <id>4</id>
        <name>   </name>
        <price>25</price>
        <author>   </author>
        <detail>
             <pressTime>  </pressTime>
             <storyTime>  </storyTime>
        </detail>
    </book>
    <book category="  " edition="5">
        <id>5</id>
        <name>   </name>
        <price>30</price>
        <author>   </author>
        <detail>
             <pressTime>  </pressTime>
             <storyTime>  </storyTime>
        </detail>
    </book>
</books>

もう1つの処理方法は反復モデルに基づく処理方法であり、反復モデルに基づく処理はカーソルモデルに基づく処理と非常に似ており、コードを見てください.
    @Test
    public void test4(){
        try {
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLEventReader reader = factory.createXMLEventReader(StaxTest.class.getResourceAsStream("books.xml"));
            while(reader.hasNext()){
                XMLEvent event = reader.nextEvent();
                if(event.isStartElement()){
                    System.out.println("<"+event.asStartElement().getName()+">");
                }else if(event.isCharacters()){
                    System.out.println(event.asCharacters().getData());
                }else if(event.isEndElement()){
                    System.out.println("</"+event.asEndElement().getName()+">");
                }
            }
        } catch (FactoryConfigurationError | XMLStreamException e) {
            e.printStackTrace();
        }

    }

このコード出力結果はtest 1()出力結果と全く同じであり、反復モデルに基づいてevent.as****を先に行い、カーソルモデルに基づいて動作する.
反復モデルにフィルタを追加すると
    @Test
    public void test5() {
        try {
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLEventReader reader = factory.createFilteredReader(factory
                    .createXMLEventReader(StaxTest.class
                            .getResourceAsStream("books.xml")), (event) -> {
                                if(event.isStartElement()) return true;
                return false;
            });
            while(reader.hasNext()){
                XMLEvent event = reader.nextEvent();
                System.out.println(event.asStartElement().getName());
            }
        } catch (FactoryConfigurationError | XMLStreamException e) {
            e.printStackTrace();
        }
    }

上記のセクションでは、jdk 8の最新のプロパティlambda式を使用して操作を簡略化し、フィルタはすべての開始ノードを返します.