-
常用的节点类型
查看全部 -
四种解析xml文件的方式:DOM、SAX、DOM4J、JDOM
查看全部 -
xml的作用
查看全部 -
books.xml实例
查看全部 -
xml结构简介
查看全部 -
常用的节点类型
查看全部 -
xml文件解析sax>dom>dom4j>jdom
查看全部 -
SAX解析XML的速度比DOM的块,
SAX的解析XML的解析器,需要重写startElement()开始解析的方法and endElemaent()方法 结束解析的方法and characters()方法
重写charaters()方法时,String(byte[] bytes,int offset,int length)的构造方法进行数组的传递
再去除解析时多余空格
if(!value.trim().equals("")){
System.out.println(value);
}
使用 SAX 解析 XML 文件的节点名和节点间文本
startElement方法——String qName(第三个参数):节点名
startElement方法——Attributes attributes(第四个参数):节点名的属性操作
characters方法——char[] ch(第一个参数):xml整个文本内容,所以需截取想要的内容
如图代码+以下代码
public void endElement(String uri, String localName, String qName)
throws SAXException {
//调用DefaultHandler类的endElement方法
super.endElement(uri, localName, qName);
//判断是否针对一本书已经遍历结束
if (qName.equals("book")) {
System.out.println("======================结束遍历某一本书的内容=================");
}
}
characters(char[] ch, int start, int length) 方法总结:
简单来说解析器首先在startDocument之后会读取XML中的字符串(从根节点开始一直到根节点结束)并放入ch[]字符数组中去,然后在解析到#TEXT节点(包括空格和换行符)时使用start来标记字符在ch[]数组中的起始位置,length标记长度,然后调用character方法,character方法默认不会进行任何处理,想进行处理需要重写方法。
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
value = new String(ch, start, length);
if (!value.trim().equals("")) {
System.out.println("节点值是:" + value);
}
}查看全部 -
获取xml的标签
开始:startElement(String uri, String localName, String qName,Attributes attributes)
获取属性名:attributes.getQName(i);获取属性值:attributes.getValue(i)
结束:endElement(String uri, String localName, String qName)
解析xml元素(重写startElement()方法)
1. 调用DefaultHanlder 的startElement()方法
super.startElement(uri,localName,qName,attributes);
2. 开始解析book元素属性
/**
* 解析xml元素
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// 调用父类(DefaultHandler)的startElement方法
super.startElement(uri, localName, qName, attributes);
// 开始解析book元素的属性
if (qName.equals("book")) {
// //已知book元素下属性的名称,根据属性名称获取属性值
// String value = attributes.getValue("id");
// System.out.println("book的属性值是:" + value);
// 不知道book元素下属性的名称以及个数,如何获取属性名以及属性值
int num = attributes.getLength();
for (int i = 0; i < num; i++) {
System.out.print("book元素的第" + (i + 1) + "个属性名是:"
+ attributes.getQName(i));
System.out.println("---属性值是:" + attributes.getValue(i));
}
}
}查看全部 -
SAX方式解析xml步骤
1.通过SAXParserFactory的静态newInstance()方法获取一个SAXParserFactory的对象。SAXParserFactory factory = SAXParserFactory.newInstance();
2.通过SAXParserFactory对象的newSAXParser()方法返回一个SAXParser类的对象。
SAXParser parser = factory.newSAXParser();
3.创建一个类继承DefaultHandler,重写其中的一些方法并创建类的实例.
类SAXParserHandler implements DefaultHandler;
4.通过SAXParser类的Parse(Stringname,df)方法解析xml文件,参数Stringname为路径名,df为继承于DefaultHandler类的实例化对象,不需要定义变量存储返回的类型.
SAX是按节点顺序进行解析,遇到xml的声明即开始解析,遇到最后一个节点的尾节点便结束解析,需要用户自己定义一个类继承于DefaultHandler类来解析,遇到开始标签节点便通过startElement开始解析节点,遇到结束标签节点便通过endElement结束解析,再遇到开始节点继续通过startElement解析,一直循环直到xml文件最后的结束标签节点.
5.在继承于DefaultHandler这个类中需要重写父类的startElement()和endElement()方法,来进行开始节点与结束节点的解析,再重写startDocument()方法与endDocument()方法来标识解析的开始与结束.
public class SAXParserHandler extends DefaultHandler {
/**
* 用来标识解析开始
*/
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("SAX解析开始");
}
/**
* 解析xml元素节点开始
*/
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
System.out.println("解析xml元素开始");
}
/**
* 处理文本内容(获取的是整个XML文本内容)
*/
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
System.out.println("文本处理中...");
}
/* 解析xml元素节点结束
*/
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
System.out.println("解析xml元素结束");
}
/**
* 用来标识解析结束
*/
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("SAX解析结束");
}6.创建SAXParserHandler对象
SAXParserHandler handler = new SAXParserHandler()
7.调用parse(url,handler实例)方法
parser.parse("book.xml",handler);查看全部 -
解析文件节点以及子节点的值
1.先获取子节点,Node下有方法getChildNodes()来获取某个节点的子节点的集合,返回NodeList类型.
NodeList childNodes=book.getChildNodes()//包含book节点所有的子节点,两个标签之间的所有内容都看成是子节点.
2.通过childNodes的getLength()方法返回字点的个数(空格与换行字符看成为一个文本节点,标签与结束标签看成一个元素节点)
3.通过NodeList的item(i)获取指定位置子节点的名称返回Node类型.再用Node类型的getNodeName()方法就可以获取节点名
Node childnode=childNodes.item(i);
String name=childnode.getNodeName();
可以通过Node类的getNodeType()来区分文本类型的node以及元素类型的node,看当前Node类型是否与Node."节点类型英文全称"相同.
if(childnode.getNodeType==Node.ELEMENT_NODE)
{System.out.println(name)}
4.不能直接通过Node的getNodeValue()来获取节点的值,因为元素节点的nodeValue的返回值为null而且标签之间的文本被看做是该标签的子节点.所以要用Node的getFirstChild()此时获取的子节点为文本节点,Text节点类型的nodeValue返回值为节点内容,再getNodeValue()。
或者直接用Node的getTextContent()方法直接获取节点值。
如果该Node节点还存在其他子节点并且有节点值<name><a>呵呵呵</a>华以及咯</name>,那么用getFirstChild().getNodeValue()一样是null,因为获取的子节点仍然是element类型的
如果用Node的getTextContent(),一样会把<a>元素节点当成是Content输出。 结果为呵呵呵华以及咯。查看全部 -
document.getElementByTagName(),获取标签集合<br>
2.node.getAttribute(),获取属性集合(应该是一个Map集合)<br>
3.NodeList集合(标签集合) NameNodeMap集合(属性集合)<br>1.获取book节点的子节点。NodeList childNodes =book.getChildNodes();<br>
2.获取book下子节点的节点内容的两种方式:<br>
1)childNodes.item(index).getFirstChild().getNodeValue();<br>
2)childNodes.item(index).getTextContent();<br>
第一种方式在其下面还有子节点时,会因为是Element节点所以默认的getNodeValue()返回值是null;<br>
第二章方式在其下面还有子节点时,会将子节点内容与当前节点内容一起获取。
注:在获取当前节点的子节点时,当前节点下的空格与回车符会被当做Text类型的子节点获取(#Test)。查看全部 -
使用Dom解析xml文件的属性节点。
在不知道节点属性的个数和属性名时:
1、通过document.getElementByTagName("标签名")获得所有标签名的节点,得到一个NodeList集合
2、通过NodeList.getLength()获得集合长度,遍历集合
3、Node node = NodeList.item(index)获得里面的节点
4、通过NamedNodeMap attrs = node.getAttributes()获取所有属性集合
5、通过attrs.getLength()遍历集合,Node attr = atrrs.item(index)
6、attr.getNodeName()获得属性名,attr.getNodeValue()获取属性值
前提已经知道book节点有且只有1个id属性,将book节点进行强制类型转换,转换成element类型。
1、通过document.getElementByTagName("标签名")获得所有标签名的节点,得到一个NodeList集合
2、通过NodeList.getLength()获得集合长度,遍历集合
3、element book=(element)bookList.item(i);//强制转换为element类型
4、string attrValue = book.getAttribute("id");DOM 方式解析 XML
DocumentBuilder db =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
// 通过DocumentBuilder对象的parse方法加载books.xml文件到当前项目下
Document document = db.parse("books.xml");
// 通过标签名获取节点集合, 获取所有book节点的集合
NodeList bookList = document.getElementsByTagName("book");
// 遍历每一个book节点
for(int i = 0; i < bookList.getLength(); i ++){
// 通过 item(i) 方法 获取 一个book节点,nodeList的索引值从 0 开始
Node book = bookList.item(i);
// 获取 book 节点的所有属性的集合
NameNodeMap attrs = book.getAttributes();
// 遍历 book 的属性
for(int j = 0; j < attrs.getLength(); j ++){
// 通过 item(index) 方法获取 book 节点的某一属性
Node attr = attrs.item(j);
// 获得属性名称
System.out.print("属性名:" + attr.getNodeName());
System.out.println("---属性值:" + attr.getNodeValue());
}
}查看全部 -
获取xml文件内容的
四种解析方式:DOM SAX DOM4J JDOM
DOM、SAX :java 官方方式,不需要下载jar包
DOM4J、JDOM :第三方,需要网上下载jar包
DOM使用步骤:
准备工作
1、创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory dbf = DocumnetBuilderFactory.instance();
2、创建一个DocumentBuilder的对象
DocumentBuilder db = dbf.newDocumentBuilder();
3、通过DocumentBuilder对象的parse方法加载xml文件到当前项目
Document document = db.parse("*.xml");查看全部 -
不同系统间通信、不同软件间通信、不同平台间通信使用xml文件
XML文件用来存储数据和传输数据
XML存储结构为树状
xml声明:<?xml version="1.0"encoding="utf-8"? >
XML作用:
不同应用程序之间通信、传输信息(订票程序和支付程序)
不同系统间的通信(例:Windows系统和IOS系统)
不同平台间的数据共享(手机端和PC端)
不同APP之间的通信,不同的平台间的通信,不同平台间的数据共享。XML文件主要用于存储以及传输信息。
通过xml文件存储小型数据。查看全部
举报