XML进行Dom解析:
一、XML进行Dom解析:
XML:可拓展的标记语言,主要用来存储数据.
Dom解析:在内存建立和xml文件相对应的树形结构数据.核心是节点,本质是节点的集合,用Dom解析Xml优点是方便操作内存中树的节点,获取需要的数据.缺点是如果Xml很大,使用Dom就会很占用内存资源
二、实现:
1.创建一个Xml文档:
<?xml version="1.0" encoding="UTF-8"?> <oracle> <user id="1"> <name>scott</name> <pwd>scott</pwd> </user> <user id="2"> <name>sys</name> <pwd>sys</pwd> </user> <user id="3"> <name>system</name> <pwd>system</pwd> </user> </oracle>
2.开始解析:
package Dom解析XML;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DOMParser {
public static void main(String[] args) {
DOMParser cb = new DOMParser();
// 1.创建DocumentBuilderFactory工厂对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
// 2.创建解析器DocumentBuilderFactory对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 3.创建文档对象
Document document = builder.parse("myXml\\cb.xml");
// 4.获取文档的根元素节点,root节点
Element element = document.getDocumentElement();
System.out.println("获得的根目录的名称:" + element.getNodeName());
NodeList userList = element.getElementsByTagName("user");
System.out.println("获得的用户的个数:" + userList.getLength());
// 5.遍历user,得到user的其他信息
System.out.println("开始解析:---------------------------------");
for (int i = 0; i < userList.getLength(); i++) {
Element user = (Element) userList.item(i);
// 对应的ID
String userId = user.getAttribute("id");
NodeList userChids = user.getChildNodes();
System.out.println("用户编号:"+userId);
//遍历当前用户下的所有子孩子
for (int j = 0; j < userChids.getLength(); j++) {
//去除#text,主要是使用org.w3c.dom.Node进行解析的,
//会将你的回车符号也作为一个节点的.
if (userChids.item(j) instanceof Element) {
System.out.println(userChids.item(j).getNodeName()
+ "<>" + userChids.item(j).getTextContent());
}
}
}
cb.More(element);
} 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();
}
}
public void More(Element element){
System.out.println("以XML显示:-------------------");
String getRootName=element.getNodeName();
System.out.println("<?xml version="+"\""+1.0+"\""+ "encoding="+"\""+"UTF-8"+"\""+"?"+">");
System.out.println(" <"+getRootName+">");
NodeList userList = element.getElementsByTagName("user");
//System.out.println("获得的用户的个数:" + userList.getLength());
// 5.遍历user,得到user的其他信息
//System.out.println("开始解析:---------------------------------");
for (int i = 0; i < userList.getLength(); i++) {
Element user = (Element) userList.item(i);
// 对应的ID
String userId = user.getAttribute("id");
NodeList userChids = user.getChildNodes();
System.out.println(" <"+"user id="+"\""+userId+"\""+">");
//遍历当前用户下的所有子孩子
for (int j = 0; j < userChids.getLength(); j++) {
//去除#text,主要是使用org.w3c.dom.Node进行解析的,
//会将你的回车符号也作为一个节点的.
if (userChids.item(j) instanceof Element) {
//System.out.println(userChids.item(j).getNodeName()
//+ "<>" + userChids.item(j).getTextContent());
String getName =userChids.item(j).getNodeName();
String getContent =userChids.item(j).getTextContent();
System.out.println(" <"+getName+">"+getContent+"</"+getName+">");
}
}
System.out.println(" </user>");
}
System.out.println(" </"+getRootName+">");
}
}
三、运行结果:
1.控制台直接输出:
2.控制台以XML形式输出:
四、总结:
1.使用org.w3c.dom.Node进行解析的,会将你的回车符号也作为一个节点的.
2.输出字符串里面显示双引号,要在里面加上 "\""
3.Dom解析Xml,通过根节点,得到根节点下的孩子,然后遍历孩子的List,得到其中一个孩子,在得到该孩子下的所有标签,通过getNodeName(),getTextContent()等方法得到具体的信息.