xml文件结构
声明版本与字符集
<bookstore>
<book id="1">
<name>冰与火之歌</name>
</book>
</bookstore>
建立根节点–>建立子节点–>建立子节点属性
xml解析的种类
Java程序中读取xml文件的过程也称为解析xml文件,解析的目的:获取节点名、节点值、属性名、属性值
4种解析方式:
1)DOM解析 2)SAX解析 —->Java官方提供的xml文件解析方式
3)DOM4J解析 4)JDOM解析 —->其他组织编写的解析xml文件的jar包,实际开发中,需要导入相应的jar包
DOM方法解析
解析流程
使用DOM解析XML
- 创建DocumentBuilderFactory对象和DocumentBuilder对象
- 通过DocumentBuilder对象的parse方法加载XML文件
- 通过getElementsByTagName方法获取节点存入list集合中
- 通过item方法获取集合中的节点,通过getAttributes()方法将节点的属性存入map集合中
- 通过getChildNodes()获取节点中的子节点存入list集合中
节点类型
book节点有属性节点和子节点,属性节点是id=1。子节点又分为element节点和text节点,element节点是用标签包含的内容,text节点是没有用标签标记的文本(包括空行)。
如
<bookstore>
<book id="1">
<name>冰与火之歌</name>
</book>
</bookstore>
节点描述如图:
类似的,DOM方法解析HTML也有对应的节点树
测试代码
public class DOMDemo {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document document = docBuilder.parse(new File("demo\\books.xml"));
//获取所有book节点的集合
//document.getElementsByTagName("book"); 通过标签名获取Node列表
NodeList bookList = document.getElementsByTagName("book");
for(int i=0;i<bookList.getLength();i++){
Node book = bookList.item(i);
NamedNodeMap attr = book.getAttributes();
System.out.println("第"+i+"本书的属性值是"+attr.item(0).getNodeName()+"="+attr.item(0).getNodeValue());
NodeList bookAtrr = book.getChildNodes();
//System.out.println(bookAtrr.item(0).getNodeName()+"="+bookAtrr.item(0).getNodeValue());
//此时输出#text=(换行),因为空行被看做一个text节点,值为换行符
for(int j=0;j<bookAtrr.getLength();j++){
if(bookAtrr.item(j).getNodeType()==Node.ELEMENT_NODE){
//bookAtrr.item(j).getFirstChild().getNodeValue()
//标签中的值其实是一个text节点
System.out.println(bookAtrr.item(j).getNodeName()+"="+bookAtrr.item(j).getFirstChild().getNodeValue());
}
}
System.out.println();
}
}
}