在java程序中如何获取xml文件的内容
一: 解析的目的 获取节点名,节点值,属性名,属性值
二:DOM方式解析的步骤(DOM需要读取整个的xml文档,然后在内存中创建DOM树,生成DOM树上的每个Node对象)
1):创建一个DocumentBuilderFactory的对象
2):通过DocumentBuilderFactory的对象创建一个DocumentBuilder对象 -->DocumentBuilderFactory的对象.newDocumentBuilde();
3):通过DocumentBuilder的parse方法来解析xml文件
public class DomTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory dof=DocumentBuilderFactory.newInstance();
//创建一个DocumentBUilder对象
try {
//通过DocumentBuilder对象的parse方法加载xml文件
DocumentBuilder db=dof.newDocumentBuilder();
Document document=db.parse("books.xml");
.....//解析文件
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}
}
这样准备工作就做完了,接下来就解析xml文件就好了 、
常见的节点类型
节点类型 | NodeType | Named Constant | nodeName的返回值 | nodeValue的返回值 |
Element | 1 | ELEMENT_NODE | element name | null |
Attr | 2 | ATTRIBUTE_NODE | 属性名称 | 属性值 |
Text | 3 | TEXT_NODE | #text | 节点内容 |
常用的方法有:
getElementsByTagName() | 获取所有的节点,返回类型为NodeList |
getLength() | 返回NodeList中节点的个数 |
item(index) | 获取一个节点,index表示索引,返回类型为Node |
getAttributes() | 获取节点中的属性,返回类型为NameNodeMap |
getNodeName() | 获取属性的名称 |
getNodeValue() | 获取属性的值 |
完成代码为:
1): xml文件内容为:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>c语言</name>
<year>2014</year>
<price>89</price>
</book>
<book id="2">
<name>数据结构</name>
<year>2004</year>
<price>89</price>
<language>English</language>
</book>
</bookstore>
2):测试类:
public class DomTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory dof=DocumentBuilderFactory.newInstance();
//创建一个DocumentBUilder对象
try {
//通过DocumentBuilder对象的parse方法加载xml文件
DocumentBuilder db=dof.newDocumentBuilder();
Document document=db.parse("books.xml");
//获取所有book节点的值
NodeList bookList=document.getElementsByTagName("book");
//通过nodelist的getLength()方法可以获取bookList的长度
System.out.println("一共有"+bookList.getLength()+"本书");
//遍历每一个book节点
for(int i=0;i<bookList.getLength();i++){
System.out.println("----下面开始遍历"+(i+1)+"个节点----");
//通过item(i)方法,获取一个book节点,NodeList的索引值从0开始
Node book=bookList.item(i);
//获取book节点的所有属性集合
NamedNodeMap nnp=book.getAttributes();
System.out.println("第"+(i+1)+"本书共有"+nnp.getLength()+"个属性");
//遍历book的属性
for(int j=0;j<nnp.getLength();j++){
//通过item(index)获取属性
Node node=nnp.item(j);
//获取属性名
System.out.println("属性名:"+node.getNodeName());
//获取属性值
System.out.println("属性值为:"+node.getNodeValue());
}
//解析book节点的子结点
NodeList childNodes=book.getChildNodes();
//遍历每个子结点的节点名和节点值
System.out.println("第"+(i+1)+"本书有"+childNodes.getLength()+"个子结点 (");
for(int k=0;k<childNodes.getLength();k++){
//获取具体子结点
Node node=childNodes.item(k);
//区分出text类型的node以及element类型的node
if(node.getNodeType()==Node.ELEMENT_NODE){
//获取element类型节点的节点名
System.out.print("第"+(k+1)+"个节点值的名称为:"+node.getNodeName());
// System.out.println("--节点值为:"+node.getFirstChild().getNodeValue());
System.out.println("-->节点值为:"+node.getTextContent());
}
}
System.out.println(")");
}
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}
}
DOM的优缺点:
-优点:
1):形成了树结构,直观好理解,代码易编写
2):解析过程中书结构保存在内存中,方便修改
-缺点
当xml文件比较大时,对内存耗费比较大,容易影响解析性能并造成内存溢出