1.读取xml文件,首先用类加载器加载项目目录下的xml文件,从XMLInputFactory创建我所需要的XMLStreamReader,即得到了xml文件。根据XMLStreamConstant

属性值,就可以操作所得到的xml文件内容,详情看以下代码。

public class TestStax {
public static void main(String[] args) {
//基于光标式的
// new TestStax().baseStax();
// new TestStax().baseStax_01();
//基于迭代模型的
// new TestStax().baseStax_02();
     //基于过滤器的 
     new TestStax().baseStax_03(); 
}
public void baseStax(){
XMLInputFactory xif = XMLInputFactory.newInstance();
InputStream is = null;
XMLStreamReader xsr = null;
try {
//第一种加载文件方式,此文件在根目录下
is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml");
xsr = xif.createXMLStreamReader(is);
while(xsr.hasNext()){
int type = xsr.next();
System.out.println(type);
if(type == XMLStreamConstants.START_ELEMENT){
System.out.println(xsr.getName());
}else if(type == XMLStreamConstants.CHARACTERS){
System.out.println(xsr.getText().trim());
}else if(type == XMLStreamConstants.END_ELEMENT){
System.out.println("/" + xsr.getName());
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void baseStax_01(){
XMLInputFactory xif = XMLInputFactory.newInstance();
InputStream is = null;
XMLStreamReader xmlsr = null;
try {
//另一种加载文件方式
is = new FileInputStream(System.getProperty("java.class.path") + File.separator + "menu.xml");
xmlsr = xif.createXMLStreamReader(is);
while(xmlsr.hasNext()){
int type = xmlsr.next();
//XMLStreamConstants.START_ELEMENT=1
if(type == 1){
if("name".equals(xmlsr.getName().toString())){
System.out.print(xmlsr.getElementText() + ":");
}else if("price".equals(xmlsr.getName().toString())){
System.out.println(xmlsr.getElementText());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void baseStax_02(){
XMLInputFactory xif = XMLInputFactory.newInstance();
InputStream is = null;
is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml");
try {
XMLEventReader xmler = xif.createXMLEventReader(is);
while(xmler.hasNext()){
XMLEvent xmle = xmler.nextEvent();
if(xmle.isStartElement()){
String name = xmle.asStartElement().getName().toString();
if("name".equals(name)){
System.out.print(xmler.getElementText() + ":");
}else if("price".equals(name)){
System.out.println(xmler.getElementText());
}
}
}
} catch (XMLStreamException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
  public void baseStax_03(){
  XMLInputFactory xif = XMLInputFactory.newFactory();
  InputStream is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml");
  XMLEventReader xmler = null;
  try {
   xmler = xif.createFilteredReader(xif.createXMLEventReader(is), new EventFilter() {
    @Override
    public boolean accept(XMLEvent event) {
     if(event.isStartElement()){
      String name = event.asStartElement().getName().toString();
      if("name".equals(name) || "price".equals(name)){
       return true;
      }
     }
     return false;
    }
   } );
  } catch (XMLStreamException e) {
   e.printStackTrace();
  }
  while(xmler.hasNext()){ 
   try {
    XMLEvent xmle = xmler.nextEvent();
    if(xmle.isStartElement()){
     String nm = xmle.asStartElement().getName().toString();
     if("name".equals(nm)){
      System.out.print(xmler.getElementText() + ":");
     }else if("price".equals(nm)){
      System.out.println(xmler.getElementText());
     }
    }
   } catch (XMLStreamException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
}

下面是我说是用的xml,在w3cSchool里弄的xml文件,也可以自己建一个xml文件

<?xml version="1.0" encoding="UTF-8"?>

 <breakfast_menu>
<food ceshi="test">
<name>Belgian Waffles</name>
<price>$5.95</price>
<description>two of our famous Belgian Waffles with plenty of real maple syrup</description>
<calories>650</calories>
</food>
<food ceshi="test">
<name>Strawberry Belgian Waffles</name>
<price>$7.95</price>
<description>light Belgian waffles covered with strawberries and whipped cream</description>
<calories>900</calories>
</food>
<food>
<name>Berry-Berry Belgian Waffles</name>
<price>$8.95</price>
<description>light Belgian waffles covered with an assortment of fresh berries and whipped cream</description>
<calories>900</calories>
</food>
<food>
<name>French Toast</name>
<price>$4.50</price>
<description>thick slices made from our homemade sourdough bread</description>
<calories>600</calories>
</food>
<food>
<name>Homestyle Breakfast</name>
<price>$6.95</price>
<description>two eggs, bacon or sausage, toast, and our ever-popular hash browns</description>
<calories>950</calories>
</food>
</breakfast_menu>

3.基于Xpath处理xml

     //基于Xpath
public void baseStax_04(){
InputStream is = null;
is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml");
XPathFactory xpf = XPathFactory.newInstance();
XPath xp = xpf.newXPath();
try {
//创建文档对象
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
//创建文档
Document doc = db.parse(is);
NodeList nl = (NodeList)xp.evaluate("//food[@ceshi='test']", doc,XPathConstants.NODESET);
// for(int i=0;i<nl.getLength();i++){
// Element ele = (Element)nl.item(i);
// String value = ele.getElementsByTagName("name").item(0).getTextContent();
// System.out.println(value);
// }
//当不把node转化为element时
for(int j=0;j<nl.getLength();j++){
NodeList nodelist = nl.item(j).getChildNodes();
for(int p=0;p<nodelist.getLength();p++){
Node nodechild = nodelist.item(p);
if(nodechild.getNodeName() != "#text"){
System.out.println(nodechild.getNodeName() + ":" + nodechild.getTextContent());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

4.修改xml,用XPath计算得到查找的位置,修改后用Transformer进行替换原文件

 public void update_xml(){
XPath xpath = XPathFactory.newInstance().newXPath();
InputStream is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml");
Document doc= null;
try {
doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
NodeList nodelist = (NodeList)xpath.evaluate("//food[name='Belgian']", doc,XPathConstants.NODESET );
Element element = (Element)nodelist.item(0);
Element ele = (Element)element.getElementsByTagName("price").item(0);
System.out.println(ele.getTextContent());
ele.setTextContent("12121");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
Result result = new StreamResult(System.out);
transformer.transform(new DOMSource(doc), result);
} catch (Exception e) {
e.printStackTrace();
}
}

5.以XMLStreamWriter的方式写入xml

 public void writeXml(){
try {
XMLStreamWriter xmlsw = XMLOutputFactory.newFactory().createXMLStreamWriter(System.out);
xmlsw.writeStartDocument("UTF-8", "1.0");
xmlsw.writeEndDocument();
String ns = "http://xiaoqiaolv";
xmlsw.writeStartElement("ns","student",ns);
xmlsw.writeStartElement("name");
xmlsw.writeAttribute("realname","zhangsan");
xmlsw.writeCharacters("text");
xmlsw.writeEndElement();
xmlsw.writeEndElement();
xmlsw.flush();
xmlsw.close();
} catch (Exception e) {
e.printStackTrace();
}
}

用Stax方式处理xml的更多相关文章

  1. spring aop注解方式与xml方式配置

    注解方式 applicationContext.xml 加入下面配置 <!--Spring Aop 启用自动代理注解 --> <aop:aspectj-autoproxy proxy ...

  2. iOS 应用数据存储方式(XML属性列表-plist)

    iOS 应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) ...

  3. iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)

    iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存 ...

  4. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  5. 用JAXP的dom方式解析XML文件

    用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...

  6. Dom方式解析XML

    public class TestXML { public static void main(String[] args) throws SAXException, IOException { //D ...

  7. (四)SAX方式解析XML数据

    SAX方式解析XML数据 ​文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...

  8. PHP 以POST方式提交XML、获取XML,最后解析XML

    以POST方式提交XML // Do a POST $data="<?xml version='1.0' encoding='UTF-8'?> <TypeRsp> & ...

  9. Struts2第十篇【数据校验、代码方式、XML配置方式、错误信息返回样式】

    回顾以前的数据校验 使用一个FormBean对象来封装着web端来过来的数据 维护一个Map集合保存着错误信息-对各个字段进行逻辑判断 //表单提交过来的数据全都是String类型的,birthday ...

随机推荐

  1. TimSort算法分析

    Timsort是一种混合稳定的排序算法,采用归并排序混合插入排序的设计,在多种真实数据上表现良好. 它基于一个简单的事实,实际中大部分数据都是部分有序(升序或降序)的. 它于2002年由Tim Pet ...

  2. Superwebsocket 模拟微信聊天室

    在园子里潜水几年了,工作以来算是有些积累,突然想写点东西方便以后温故而知新,希望自己能够坚持下去. 关于Superwebsocket的介绍我就不多说了,请点击:http://www.cnblogs.c ...

  3. OC 常用方法记录

    1.排序 给数组排序 按照字母的升序 //对key按字母升序排序 NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparis ...

  4. (转)JAVA的整型与字符串相互转换

    JAVA的整型与字符串相互转换1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或         ...

  5. 微信公众号平台接口开发:基础支持,获取微信服务器IP地址

    官方说明 目前看不出来这个接口有哪些具体运用,但是既然有这个接口,那我们就试试能不能用 访问接口 修改WeCharBase.cs,新增以下2个方法 public static string Serve ...

  6. find查找命令

    find # 格式 find [路径] [参数] [表达式] -exec 指令 {} \ ; -{} 代表find找到的文件 -\ 禁止转意 : 表示本行指令结束 # find /sbin -type ...

  7. B. Pasha and Phone

    B. Pasha and Phone time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  8. 第四章:JQuery选择器

    一.使用选择器的目的 从页面上的万万千千个元素中选择自己需要的. 二.选择器的分类 1.基本选择器 *:标签 *:类 *:ID 交集  AB   AB共同的部分    并集  A,B  AB使用相同的 ...

  9. 1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)

    这道题吗= =首先解决了我多年以来对仙人掌图的疑问,原来这种高大上的东西原来是这个啊= = 然后,看到这种题,首先必须的就是缩点= = 缩点完之后呢,变成在树上找最长路了= =直接树形dp了 那么那些 ...

  10. MD5算法学习整理

    一路学来 记得笔记不少 但是给自己看 当时就记得很随意 以为后面都懂 但还是太单纯了,现在回顾 自己都完全看不下去,所以以后的都放的博客上,让自己看懂,让感兴趣的看懂,详细,暴力 不废话了 MD5算法 ...