使用JAXP解析XML

一个简单用到的XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <Account>
        <username age="27">mingjava</username>
        <email>eric.zhan@263.net</email>
        <company>j2medev</company>
    </Account>
</root>

 

 

ParseMIDlet是javax.microedition.midlet.MIDlet的子类。程序启动后,ParseMIDlet从document.xml读取内容并显示在Form上。注意这一步并不解析document.xml。ParseMIDlet的源码如下:

package com.j2medev.chapter10;

import java.io.InputStream;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class ParseMIDlet extends MIDlet implements CommandListener,Runnable{

 private Display display = null;
 private Form form = null;
 private Thread thread = null;
 private Command parseCommand = new Command("parse",Command.OK,1);
 
 protected void startApp() throws MIDletStateChangeException {
  if(display == null){
   display = Display.getDisplay(this);
   form = new Form("jaxp");
   //把document.xml的原始内容显示在Form上
   InputStream is = getClass().getResourceAsStream("/document.xml");
   
   try {
    byte[] data = new byte[is.available()];
    is.read(data);
    form.append(new String(data));
    //正确显示出来才添加parseCommand
    form.addCommand(parseCommand);
   } catch (Exception e) {
    e.printStackTrace();
    form.append(e.getMessage());
   }
   form.addCommand(new Command("exit",Command.EXIT,1));
   form.setCommandListener(this);
  }
  display.setCurrent(form);
 }
 public void commandAction(Command cmd,Displayable d){
  if(cmd.getCommandType() == Command.EXIT){
   try {
    destroyApp(false);
   } catch (MIDletStateChangeException e) {
    e.printStackTrace();
   }
   notifyDestroyed();
  }else if(cmd == parseCommand){
   //开始解析,在单独的线程中完成
   thread = new Thread(this);
   thread.start();
   
  }
 }
 public void run(){
  form.deleteAll();
  form.append("parsing the xml file");
  //创建SAXParserFactory实例
  SAXParserFactory instance = SAXParserFactory.newInstance();
  try {
   //创建SAXParser
   SAXParser parser = instance.newSAXParser();
   InputStream is = getClass().getResourceAsStream("/document.xml");
   
   //开始解析
   parser.parse(is,new MyHandler(form));
  } catch (Exception e) {
   e.printStackTrace();
  }
  form.removeCommand(parseCommand);
  display.setCurrent(form);
 }
 protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
 }

 protected void pauseApp() {
 }

 

}


 

 

为了避免堵塞用户界面,这里在单独的线程中解析document.xml文件。首先需要创建一个SAXParseFactory对象,SAXParseFactory允许我们配置和创建一个基于SAX的解析器.

SAXParseFactory instance  SAXParseFactory.newInstance();

    获得SAXParseFactory对象后即可调用它的newParse()方法创建一个SAXParse 解析器。创建了SAXParse对象后,就可以从InputStream中解析XML了,开始解析时DefaultHandler中的相关方法会按照顺序调用。本例中的MyHandler类时DefaultHandler的子类,底层的解析工作就是由它完成的。

 

MyHandler类:

    真正的解析工作都是在MyHandler类中完成的,MyHandler包含一个form成员变量,目的是把解析到的内容直接显示在Form中。

 

    SAXParse是基于事件模型的,顺序解析XML文件。例如,解析到文档开头部分时,startDocument()方法会被调用;解析到文件的末尾时,endDocument()方法会被调用。类似的,当开始解析一个XML元素时,startElement()方法会被调用;解析某个元素结束时,endElement()方法会被调用。关于DefaultHandler的方法定义请参考JSR172的java文档。

 

package com.j2medev.chapter10;

import javax.microedition.lcdui.Form;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyHandler extends DefaultHandler{
   
    private Form form = null;
   
    public MyHandler(Form _form) {
        form = _form;
        form.deleteAll();
    }
   
    public void startDocument() throws SAXException {
     System.out.println("startDocument");
    }
   
    public void characters(char[] ch, int start, int length) throws SAXException {
        if(length != 0)
            form.append(new String(ch,start,length));
        System.out.println("characters");
    }
   
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        //读取username|email|company字段的值
     int num=0;
        if(qName.equals("username") || qName.equals("email")||qName.equals("company")){
            form.append(qName);
            //判断属性是否为空
            int len = attributes.getLength();
            if(len != 0){
                for(int i = 0;i<len;i++){
                    form.append("("+attributes.getQName(i)+attributes.getValue(i)+")");
                }
            }
            form.append(":");
        }
        num = num+1;
     System.out.println("num=:"+num);
     
    }
   
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if(qName.equals("username") || qName.equals("email")||qName.equals("company")){
         form.append("/n");
        }
        System.out.println("endElement");
           
       
    }
   
    public void endDocument() throws SAXException {
       
    }
   
}

 

运行ParseMIDlet 解析document.xml文件的结果如下图:

 

参考:《Java ME核心技术与最佳实践》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中解析XML可以使用Java内置的DOM解析器或者使用第三方库如JAXB或JDOM。这里我将介绍如何使用DOM解析器进行XML解析。 首先,你需要添加相关的依赖到你的项目中。在pom.xml文件中,添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>javax.xml.parsers</groupId> <artifactId>jaxp-api</artifactId> </dependency> ``` 接下来,我们创建一个XML解析的工具类。这个工具类可以使用DOM解析器来解析XML文件。 ```java import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; public class XmlParser { public void parseXml(String filePath) { try { File xmlFile = new File(filePath); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(xmlFile); // 获取根元素 Element rootElement = document.getDocumentElement(); // 获取所有子元素 NodeList nodeList = rootElement.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; // 根据标签名获取元素值 String value = element.getElementsByTagName("tag_name").item(0).getTextContent(); System.out.println(value); } } } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们通过DOM解析解析XML文件,并使用`getElementsByTagName`方法来获取指定标签的元素值。 最后,你可以在你的代码中实例化这个工具类,并调用`parseXml`方法来解析XML文件。 ```java public class Main { public static void main(String[] args) { XmlParser xmlParser = new XmlParser(); xmlParser.parseXml("path_to_xml_file"); } } ``` 请将`path_to_xml_file`替换为你实际的XML文件路径。这样你就可以使用DOM解析器来解析XML文件了。希望对你有所帮助!如果有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值