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. C# 6 与 .NET Core 1.0 高级编程 - 37 章 ADO.NET

    译文,个人原创,转载请注明出处,有不对的地方欢迎指出与交流. 英文原文:Professional C# 6 and .NET Core 1.0 - 37 ADO.NET --------------- ...

  2. HTML5 技术在风电、光伏等新能源领域的应用

    随着新一轮工业革命兴起,应对气候变化日益成为全球共识,能源技术正在成为引领能源产业变革.实现创新驱动发展的源动力.从全球到中国,以风能.光伏发电为代表的新能源产业发展迅速,可再生能源发电与现代电网的融 ...

  3. spring和UEditor结合

    前言 春节无聊,就去弄一下富文本编辑器,然后百度了一番,很多说百度的UEditor不错,然后去官网照着文档弄一遍,是挺简单好用的.然后想把这玩意结合到自己的一个spring项目里面,果然还是在点上传图 ...

  4. Java Web(三) 会话机制,Cookie和Session详解

    很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...

  5. ArcGIS许可启动问题

    前段时间,由于360常常删除重要文件终于发生在我身上.不得已换了电脑管家,清理后再次打开License Server Administrator时,发现启动项怎么也点不动了.而打开服务管理器,却发现A ...

  6. 如何用js实现自适应,原来只是几行代码的事(╯‵□′)╯︵┻━┻

    在javascript写下如下几行:   (function (doc, win, undefined) {            var docEl = doc.documentElement,   ...

  7. HTTP基础知识(一)

    一.了解web及网络基础 1.通过发送请求获取服务器资源的web浏览器等的都可称为客户端(client) 2.HTTP:HyperText Transfer Protocol,超文本传输协议:所有的W ...

  8. linux 下maven安装

    版本要求maven3.2.3 软件下载 wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.2.3/binaries/apache-maven-3 ...

  9. unity3d教程-01-安装及使用Unity

    我们前往unity官网:https://unity3d.com/cn/ 选择下载个人版,免费使用,功能齐全,就是在应用启动时有unity的动画 支持正版从我做起 整个安装过程需要网络的支持 下载安装程 ...

  10. mac上搭建appium环境过程以及遇到的问题

    Mac环境安装appium 一.Java环境 下载java sdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downl ...