DOM解析XML
步骤:
1、导入dom.jar包
2、创建DocumentBuilderFactory对象,开始进行XML解析
public class DomDemo {
public static void main(String[] args) {
//一般情况,工程中的相对路径都是相对于当前工程而言
File file = new File("src/demo.xml");
//使用输入流
try {
FileInputStream fis = new FileInputStream(file);
//此对象用来初始化XML解析前的配置
DocumentBuilderFactory docuemntFactory = DocumentBuilderFactory.newInstance();
//通过工程模式创建了一个DocuemntBuilder对象
//DocumentBuilder是用来操作XML文档
DocumentBuilder builder = docuemntFactory.newDocumentBuilder();
//开始解析XML文件
//加载到内存中的XML输入流对象
//返回对象document表示的就是整个XML文档
Document doc = builder.parse(fis);
//从document中获取xml中的数据
//获取省得数据
NodeList provinceNodeList = doc.getChildNodes();//getChildNodes获取当前文档下的所有直接子节点
//遍历省
//获取子节点的个数
int provinceSize = provinceNodeList.getLength();
for(int i=0; i<provinceSize; i++){
Node provinceNode = provinceNodeList.item(i);
//获取节点的名称
String node = provinceNode.getNodeName();
if ("province".equals(node)){
//获取省下的所有城市节点
NodeList cityNodeList = provinceNode.getChildNodes();
//获取city的个数
int citySize = cityNodeList.getLength();
for(int j=0; j<citySize; j++){
//获取子节点
Node cityNode = cityNodeList.item(j);
//取出所有的节点名称
String cityNodeName = cityNode.getNodeName();
//获取节点中的文本内容
String cityName = cityNode.getTextContent();
if (cityNode.hasAttributes()){
//获取属性
NamedNodeMap attrMap = cityNode.getAttributes();
Node codeNode = attrMap.getNamedItem("code");
String codeStr = codeNode.getNodeValue();
System.out.println(cityNodeName + "--" + cityName + "--" + codeStr);
}
}
}
System.out.println(node);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
SAX解析XML
步骤:
1、导入jar包
2、创建SAXParserFactory对象,开始XML的解析
public class SaxDemo {
private static List<CityBean> list = new ArrayList<>();
public static void main(String[] args) {
try {
File file = new File("src/demo.xml");
FileInputStream fis = new FileInputStream(file);
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = parserFactory.newSAXParser();
/*
*参数1:用于操作XML文档的流
*参数2:用于解析XML的对象
*/
saxParser.parse(fis, new MyHandler());
for(CityBean city:list){
System.out.println(city.getName());
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 要进行XML解析。对XML进行拆解
* @author
*
*/
static class MyHandler extends DefaultHandler {
private CityBean cityBean;
/**
* 开始XML文档的遍历
*/
@Override
public void startDocument() throws SAXException {
System.out.println("开始读取文档");
}
/**
* 结束XML文档的遍历
*/
@Override
public void endDocument() throws SAXException {
System.out.println("结束读取文档");
}
/**
* 开始一个XML标签的遍历
* 参数3:节点名称
* 参数4:属性集合
*
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
System.out.println("---" + qName);
String attrValue = attributes.getValue("code");//获取code属性中值
System.out.println("attr--" + attrValue);
if ("city".equals(qName)){
cityBean = new CityBean();
cityBean.setCode(attrValue);
}
}
/**
* 结束一个XML标签遍历
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("---结束标签遍历--" + qName);
if ("city".equals(qName)){
list.add(cityBean);
}
//为了避免出现互相干扰,每次标签开始时创建的对象,在结束时都应该进行重置
cityBean = null;
}
/**
* 读取开始标签和结束标签中间的文字内容
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println(new String(ch,start,length));
if (cityBean != null){
cityBean.setName(new String(ch,start,length));
}
}
}
}
DOM和SAX优缺点
DOM
优点:将整个文档预先加载到内存中,提升了操作的速度。支持XML文件的修改、删除、重新排列等。
缺点:预先加载到内存中,会比较消耗内存,影响机器的运行效率。
SAX
优点:
不会预先加载整个文件到内存,边读边加载的方式。适用于机器内存少的情况。
缺点:
没有记忆功能,读过一次的内容,下次如果再读,还是需要重新加载文档。