非常感谢孙浩老师。
“光标”
方法一:
/**
* @Title: test01
* @Description: 用“光标”从上至下输出menus.xml的普通节点的名字和文本节点的文本
* @param
* @return void
* @throws
*/
@Test
public void test01() {
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream stream = TestStax.class.getClassLoader()
.getResourceAsStream("menus.xml");
try {
XMLStreamReader reader = factory.createXMLStreamReader(stream);
while (reader.hasNext()) {
int index = reader.next();
// 开始节点
if (index == XMLStreamConstants.START_ELEMENT) {
System.out.println(reader.getName());
// 文本节点
} else if (index == XMLStreamConstants.CHARACTERS) {
System.out.println(reader.getText().trim());
// 结束节点
} else if (index == XMLStreamConstants.END_ELEMENT) {
System.out.println("/" + reader.getName());
}
}
} catch (XMLStreamException e) {
e.printStackTrace();
} finally {
if (stream != null)
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
方法二:
/**
* @Title: test02
* @Description: 用“光标”从上至下输出menus.xml中“food”元素的第一个属性。
* @param
* @return void
* @throws
*/
@Test
public void test02() {
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream stream = TestStax.class.getClassLoader()
.getResourceAsStream("menus.xml");
try {
XMLStreamReader reader = factory.createXMLStreamReader(stream);
while (reader.hasNext()) {
int index = reader.next();
// 开始节点
if (index == XMLStreamConstants.START_ELEMENT) {
if (reader.getName().toString() == "food") {
System.out.println(reader.getAttributeName(0) + ":\t"
+ reader.getAttributeValue(0));
}
}
}
} catch (XMLStreamException e) {
e.printStackTrace();
} finally {
if (stream != null)
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
方法三:
/**
* @Title: test03
* @Description: 用“光标”从上至下输出menus.xml中每个“food”的name和price。
* @param
* @return void
* @throws
*/
@Test
public void test03() {
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream stream = TestStax.class.getClassLoader()
.getResourceAsStream("menus.xml");
try {
XMLStreamReader reader = factory.createXMLStreamReader(stream);
while (reader.hasNext()) {
int index = reader.next();
// 开始节点
if (index == XMLStreamConstants.START_ELEMENT) {
String name = reader.getName().toString();
if (name == "name") {
System.out.print(reader.getElementText() + "\t");
}
if (name == "price") {
System.out.println(reader.getElementText());
}
}
}
} catch (XMLStreamException e) {
e.printStackTrace();
} finally {
if (stream != null)
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
迭代模型
/**
* @Title: test04
* @Description: 用迭代模型的操作方式输出menus.xml中每个“food”的name和price。
* @param
* @return void
* @throws
*/
@Test
public void test04() {
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream stream = TestStax.class.getClassLoader()
.getResourceAsStream("menus.xml");
try {
XMLEventReader reader = factory.createXMLEventReader(stream);
int num = 0;
while (reader.hasNext()) {
// 通过XMLEvent来获取是否是某种节点类型
XMLEvent event = reader.nextEvent();
if (event.isStartElement()) {
// 通过event.asxxx转换节点
String name = event.asStartElement().getName().toString();
if (name == "name") {
System.out.print(reader.getElementText() + "\t");
}
if (name == "price") {
System.out.println(reader.getElementText());
}
}
num++;
}
System.out.println(num);
} catch (XMLStreamException e) {
e.printStackTrace();
} finally {
if (stream != null)
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Filter
/**
* @Title: test05
* @Description: 用Filter的过滤方式输出menus.xml中每个“food”的name和price。
* @param
* @return void
* @throws
*/
@Test
public void test05() {
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream stream = TestStax.class.getClassLoader()
.getResourceAsStream("menus.xml");
try {
//基于Filter的过滤方式,可以有效的过滤掉不用进行操作的节点,效率会高一些
XMLEventReader reader = factory.createFilteredReader(
factory.createXMLEventReader(stream), new EventFilter() {
//返回true表示会显示,返回false表示不显示
@Override
public boolean accept(XMLEvent event) {
if (event.isStartElement()) {
String name = event.asStartElement().getName()
.toString();
if (name.equals("name") || name.equals("price")) {
return true;
}
}
return false;
}
});
int num = 0;
while (reader.hasNext()) {
// 通过XMLEvent来获取是否是某种节点类型
XMLEvent event = reader.nextEvent();
if (event.isStartElement()) {
// 通过event.asxxx转换节点
String name = event.asStartElement().getName().toString();
if (name == "name") {
System.out.print(reader.getElementText() + "\t");
}
if (name == "price") {
System.out.println(reader.getElementText());
}
}
num++;
}
System.out.println(num);
} catch (XMLStreamException e) {
e.printStackTrace();
} finally {
if (stream != null)
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
发现filter的效率是非常高的,循环次数是最好的。