在用DOM解析一个比较复杂点的xml文件
有student.xml:
解析代码如下:
File file=new File("D://student.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document docment=builder.parse(file);
Element root=docment.getDocumentElement();
NodeList nl=root.getElementsByTagName("class");
System.out.println("总共有"+nl.getLength()+"个班级");
//得到节点的子节点
NodeList cls=root.getChildNodes();
for(int h=0;h Node classes=cls.item(h); if(classes.getNodeType()==Node.ELEMENT_NODE){ //取得节点的属性值 String name=classes.getAttributes(). getNamedItem("name").getNodeValue(); System.out.println("班级:"+name); System.out.println("======="); //轮循子节点 for(Node node=classes.getFirstChild();node!=null;node=node.getNextSibling()){ if(node.getNodeType()==Node.ELEMENT_NODE){ if(node.getNodeName().equals("student")){ String id=node.getAttributes().getNamedItem("id") .getNodeValue(); System.out.println("学生ID:"+id); for(Node node1=node.getFirstChild();node1!=null;node1=node1.getNextSibling()){ if(node1.getNodeType()==Node.ELEMENT_NODE){ if(node1.getNodeName().equals("name")){ System.out.println("学生姓名:"+node1.getFirstChild().getNodeValue()); } if(node1.getNodeName().equals("age")){ System.out.println("学生年龄:"+node1.getFirstChild().getNodeValue()); } } } } } } } } 打印结果: 总共有2个班级 班级:1 ======= 学生ID:1 学生姓名:龙准 学生年龄:25 学生ID:2 学生姓名:龙准2 学生年龄:25 学生ID:3 学生姓名:龙准3 学生年龄:25 班级:2 ======= 学生ID:1 学生姓名:廖丽1 学生年龄:25 学生ID:2 学生姓名:廖丽2 学生年龄:25 DOM+xpath解析XML文档 try { new FileInputStream("D: \\book.xml")); //通过XML获得book的authors的author子节点列表 "book/authors/author", doc,XPathConstants.NODESET); //获得book的authors的第一个子节点,注意NODESET和NODE的区别 } catch (ParserConfigurationException e) { DOM的增删改 以第一个xml文档为例: 新增一个user节点: Element eleUser=doc.createElement(“user”); Element eleName=doc.createElement(“name”); Element eleAge=doc.createElement(“age”); Text nametext=doc.createTextNode(“new龙准”); Text agetext=doc.createTextNode(“23”); eleName.appendChild(nametext); eleAge.appendChild(agetext); eleUser.appendChild(eleName); eleUser.appendChild(eleAge); eleUser.setAttribute(“id”,”3”); Element root=doc.getDocumentElement(); Root.appendChild(eleUser); 删除第一个user NodeList users=root.getElementByTagName(“user”); Root.removeChild(users.item(0)); 修改第一个user的age值 Element e=root.getElementByTagName(“user”).item(0); Node age=e.getElementByTagName(“age”).item(0); Age.getFirstNode.setNodeValue=”24”; 以上操作全在内存中,并没有持久化到文件,如果需要持久化到文件需要用到transformerFactory TransformerFactory transformerfactory=TransformerFactory.newInstance(); Tansformer transformer=transformerfactory.newTransformer(); //设置编码字符集 Transformer.setOutPutProperty(“encoding”,”utf-8”); //获取源数据对象 DOMSource source=new DOMSource(doc); //设置目标对象 File ff=new File(“d://2.xml”); If(!ff.isexists){ ff.createNewFile(); } StreamResult sr=new StreamResult(ff); transformer..transform(source,sr); Xpath的详细介绍请看Xpath的pdf文档 DOM的相关操作到此为止,把以上所讲多练习,DOM操作xml文档就没问题了
//注意,节点的属性也是它的子节点。它的节点类型也是Node.ELEMENT_NODE
//读取book.xml到内存
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder dbd = dbf.newDocumentBuilder();
Document doc = dbd.parse(
XPathFactory f = XPathFactory.newInstance();
XPath path = f.newXPath();
NodeList authors= (NodeList) path.evaluate(
System.out.println(authors.getLength());
//遍历取到的元素
if(authors!=null){
for(int i=0;i
int n = i + 1;
System.out.print(n+". 名字:"+author.getNodeName());
System.out.println();
}
}
Node author= (Node) path.evaluate("book/authors/author", doc,XPathConstants.NODE);
System.out.println(" 名称:"+author.getNodeName());
System.out.println(" 内容:"+author.getTextContent());//如果存在内容则返回内容,不存在则返回空
//获取节点的属性
NamedNodeMap attr = author.getAttributes();
System.out.println(" 该节点的属性个数"+attr.getLength());
//遍历元素的属性
if(attr!=null){
for(int i=0;i
System.out.print(" 属性"+n+" 名称:"+attr.item(i).getNodeName());
System.out.print(" 值:"+attr.item(i).getNodue());
System.out.print(" 类型:"+attr.item(i).getNodeType());
System.out.println();
}
}
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
}