最近学习了三种解析XML的方式 SAX DOCUMENT STAX ,下面记录一下Stax对于xml文件的解析。共有三种方式
//基于光标的处理
@Test
public void TEST1(){
//创建XMLStreamReader的工厂
XMLInputFactory factory=XMLInputFactory.newInstance();
//创建流
InputStream is=null;
//创建XMLStreamReader
try {
is=testTax.class.getClassLoader().getResourceAsStream("li.xml");
XMLStreamReader reader=factory.createXMLStreamReader(is);
while(reader.hasNext()){
//返回节点数字
//System.out.println(reader.next());
int i=reader.next();
if(i==XMLStreamConstants.START_ELEMENT){
//System.out.println(reader.getName());
//读取属性的值
if("book".equals(reader.getName().toString())){
System.out.println(reader.getAttributeName(0)+":"+reader.getAttributeValue(0));
}
//获取元素的文本信息
if("title".equals(reader.getName().toString())){
System.out.println(reader.getElementText());
}
}else if(i==XMLStreamConstants.CHARACTERS){
//获取文本
//System.out.println(reader.getText().trim());
}else if(i==XMLStreamConstants.END_ELEMENT){
System.out.println(reader.getName());
}
}
//基于迭代的解析方式
@Test
public void TEST2(){
XMLInputFactory factory=XMLInputFactory.newInstance();
InputStream is=null;
try {
is=testTax.class.getClassLoader().getResourceAsStream("li.xml");
XMLEventReader reader=factory.createXMLEventReader(is);
while(reader.hasNext()){
//通过xmlEvent来获取是否是某种节点类型
XMLEvent event=reader.nextEvent();
if(event.isStartElement()){
//通过asxxx转换节点
String name=event.asStartElement().getName().toString();
if("price".equals(name)){
System.out.println(reader.getElementText());
}
//获取元素的文本信息
if("title".equals(name)){
System.out.println(reader.getElementText());
}
}
}
//过滤器
@Test
public void TEST3(){
XMLInputFactory factory=XMLInputFactory.newInstance();
InputStream is=null;
try {
is=testTax.class.getClassLoader().getResourceAsStream("li.xml");
//过滤掉不用的节点
XMLEventReader reader=factory.createFilteredReader(factory.createXMLEventReader(is),
new EventFilter() {
@Override
public boolean accept(XMLEvent event) {
if(event.isStartElement()){
return true;
}
return false;
}
});
while(reader.hasNext()){
//通过xmlEvent来获取是否是某种节点类型
XMLEvent event=reader.nextEvent();
if(event.isStartElement()){
//通过asxxx转换节点
String name=event.asStartElement().getName().toString();
if("price".equals(name)){
System.out.println(reader.getElementText());
}
//获取元素的文本信息
if("title".equals(name)){
System.out.println(reader.getElementText());
}
}
}
//Xpath的解析方式
@Test
public void TEST4(){
InputStream is=null;
try {
is=testTax.class.getClassLoader().getResourceAsStream("li.xml");
//创建文档处理对象
DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
//创建文档对象
Document doc=db.parse(is);
//创建Xpath对象
XPath xp=XPathFactory.newInstance().newXPath();
//参数:xpath ; 文档 ;节点
NodeList list =(NodeList)xp.evaluate("//book[@category='WEB']", doc, XPathConstants.NODESET);
for(int i=0;i<list.getLength();i++){
Element e1=(Element)list.item(i);
System.out.println(e1.getElementsByTagName("title").item(0).getTextContent());
}