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.开始解析:
扫描二维码关注公众号,回复:
824381 查看本文章
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()等方法得到具体的信息.