Java Stax操作XMLの概要
staxを使用してxmlを操作するのは非常に簡単で、その読み取りプロセスはカーソルが移動しているようです.異なるノードに対して異なる処理を行う.まず、カーソルベースのモデル処理xmlを見てみましょう.
もう1つの処理方法は反復モデルに基づく処理方法であり、反復モデルに基づく処理はカーソルモデルに基づく処理と非常に似ており、コードを見てください.
このコード出力結果はtest 1()出力結果と全く同じであり、反復モデルに基づいてevent.as****を先に行い、カーソルモデルに基づいて動作する.
反復モデルにフィルタを追加すると
上記のセクションでは、jdk 8の最新のプロパティlambda式を使用して操作を簡略化し、フィルタはすべての開始ノードを返します.
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式を使用して操作を簡略化し、フィルタはすべての開始ノードを返します.