一、XML解析技术概述
XML解析方式分为两种:dom和sax
dom:(Document Object Model,即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。
sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。
XML解析器
Crimson、Xerces 、Aelfred2
二、获得JAXP中的DOM解析器
调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表
整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。
更新XML文档:利用Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:javax.xml.transform.dom.DOMSource类来关联要转换的document对象,用javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。
Transformer对象通过TransformerFactory获得。
三、使用dom方式对xml文档进行crud
/**
* 读取xml文档中节点中的值
* @throws Exception
*/
@Test
public void test() throws Exception{
//调用DocumentBuilderFactory.newInstance() 方法得到创建DOM解析器的工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//调用工厂对象的newDocumentBuilder方法得到DOM解析器对象
DocumentBuilder builder=builderFactory.newDocumentBuilder();
/*File file=new File("/day24/src/fuxi.xml");
System.out.println(file+"-----");*/
//解析指定的文件
Document document=builder.parse(this.getClass().getClassLoader().getResourceAsStream("src//fuxi.xml"));
//getInfo(document);
list(document);
}
/**
* 遍历文档
* @param document
*/
public void list(Document document) {
NodeList nodeList=document.getElementsByTagName(document.getDoctype().getName());
for (int i = 0; i < nodeList.getLength(); i++) {
//获取指定的节点
Node node=nodeList.item(i);
listNode(node);
}
}
public void listNode(Node node) {
//节点是什么类型的节点
if (node.getNodeType()==1) {//判断是否是元素节点
Element element=(Element) node;
if (element.hasAttributes()) {
NamedNodeMap namenm=element.getAttributes();//Node
for (int k = 0; k < namenm.getLength(); k++) {
Attr attr=(Attr) namenm.item(k);
System.out.println("name:::"+attr.getNodeName()+"value:::"+attr.getNodeValue()+"type::"+attr.getNodeType());
}
}
NodeList listnode=element.getChildNodes();
for (int j = 0; j <listnode.getLength(); j++) {
Node nd=listnode.item(j);
System.out.println("name:::"+nd.getNodeName()+"value:::"+nd.getNodeValue()+"type::"+nd.getNodeType());
listNode(nd);
}
}
}
四、根据document对象获取一些相关的信息
public void getInfo(Document document) { System.out.println("版本号:"+document.getXmlVersion());//version="1.0" System.out.println("DOCTYPE:"+document.getDoctype().getNodeType()); System.out.println("跟标签::"+document.getDoctype().getName()); System.out.println("SYSTEM ID::"+document.getDoctype().getSystemId()); }
五、类型的值
public void testTypeValue() {
System.out.println("属性节点的类型值:" + Node.ELEMENT_NODE);//元素节点类型为1
System.out.println("属性节点的类型值:" + Node.ATTRIBUTE_NODE);//属性节点类型为2
System.out.println("属性节点的类型值:" + Node.TEXT_NODE);//文本节点类型为3
System.out.println("属性节点的类型值:" + Node.ENTITY_NODE);//实体节点类型为6
System.out.println("属性节点的类型值:" + Node.COMMENT_NODE);//注释节点类型为8
System.out.println("属性节点的类型值:" + Node.DOCUMENT_NODE);//文档节点类型为9
System.out.println("属性节点的类型值:" + Node.DOCUMENT_TYPE_NODE);//节点声明的类型为10
}
六、Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。
@Test public void test() throws SAXException,IOException,ParserConfigurationException { Document document = DocumentBuilderFactory .newInstance() .newDocumentBuilder() .parse(this.getClass ().getClassLoader() .getResourceAsStream("parsers//java.xml")); // findNodeByAttrValue(document,"Boss姚"); // findNodeById(document,"x121"); try { // deleteNodeById(document,"x121"); // updateNodeById(document,"x121"); addNodeById(document,"x121"); } catch (TransformerException e) { System.out.println("异常信息出现了。。。 。。。。"); e.printStackTrace(); } } /** * 根据标签的名称查找所有该名称的节点对象 */ public void findNode(Document document) { //根据标签名称获取该名称的所有节点对象 NodeList nodelist = document.getElementsByTagName("teacher"); //遍历 for (int i = 0; i < nodelist.getLength(); i++) { //得到具体的某个节点对象 Node node = nodelist.item(i); System.out.println(node.getNodeName()); } } /** * 根据属性的值 查询某个节点对象 * 属性值是唯一(假设) * @param document * @param value * @return */ public Node findNodeByAttrValue(Document document,String value) { //根据标签名称获取该名称的节点对象集合 NodeList nodelist = document.getElementsByTagName("teacher"); //遍历 for (int i = 0; i < nodelist.getLength(); i++) { //获取某个具体的元素节点对象 Element node = (Element) nodelist.item (i); //根据属性名称获取该节点的属性节点对象 Attr attr = node.getAttributeNode ("name"); //获取属性节点的值是否给指定的节点属性值 相同 if (attr.getNodeValue().equals(value)) { //返回此节点 return node; } } return null; } /** * 根据id获取某个节点对象 * * @param document * @param id * @return */ public Node findNodeById(Document document,String id) { return document.getElementById(id); } /** * 删除某个节点对象 * * @param document * @param id * @throws TransformerException */ public void deleteNodeById(Document document,String id) throws TransformerException { //获取删除的节点对象 Node node = document.getElementById(id); // 是通过父节点调用removeChild(node)把子节点给删 除掉 Node node1 = node.getParentNode().removeChild (node); //创建TransformerFactory对象 TransformerFactory transformerFactory = TransformerFactory .newInstance(); //Transformer类用于把代表XML文件的Document对象转 换为某种格式后进行输出 //Transformer对象通过TransformerFactory获得 Transformer transformer = transformerFactory.newTransformer(); // 把Document对象又重新写入到一个XML文件中。 transformer.transform(new DOMSource(document),new StreamResult( new File("src//a.xml"))); } /** * 更新某个节点 * * @param document * @param id * @throws TransformerException */ public void updateNodeById(Document document,String id) throws TransformerException { //根据id获取元素指定的元素节点对象 Element node = document.getElementById(id); //获取元素节点的id属性节点对象 Attr attr = node.getAttributeNode("id"); //修改元素节点的属性值 attr.setValue("x122"); //获取该节点对象的所有孩子节点对象name、age、sex 节点 NodeList nodelist = node.getChildNodes(); //遍历 for (int i = 0; i < nodelist.getLength(); i++) { //得到具体的节点对象 Node n = nodelist.item(i); //判断是否是元素节点对象 if (n.getNodeType() == Node.ELEMENT_NODE) { //看是否是name节点 if (n.getNodeName().equals ("name")) { n.setTextContent("君 君");//修改其值 } else if (n.getNodeName ().equals("age")) {//看看是否是age节点 n.setTextContent ("80");//修改其值 } else if (n.getNodeName ().equals("sex")) {//看看是否是sex节点 n.setTextContent ("男");//修改其值 } else { System.out.println("不做 处理"); } } } //创建TransformerFactory对象 TransformerFactory transformerFactory = TransformerFactory .newInstance(); //Transformer类用于把代表XML文件的Document对象转 换为某种格式后进行输出 //Transformer对象通过TransformerFactory获得 Transformer transformer = transformerFactory.newTransformer(); //把Document对象又重新写入到一个XML文件中。 transformer.transform(new DOMSource(document),new StreamResult( new File("src//b.xml"))); } /** * 在指定的节点下方添加新某个节点 * * @param document * @param id * @throws TransformerException */ public void addNodeById(Document document,String id) throws TransformerException { Element node = document.getElementById(id); Node parentNode = node.getParentNode(); Element nd = document.createElement("student"); nd.setAttribute("id","x123"); Node name = document.createElement("name"); name.appendChild(document.createTextNode("陈红军 ")); Node age = document.createElement("age"); age.appendChild(document.createTextNode("20")); Node sex = document.createElement("sex"); sex.appendChild(document.createTextNode("男")); nd.appendChild(name); nd.appendChild(age); nd.appendChild(sex); parentNode.appendChild(nd); //创建TransformerFactory对象 TransformerFactory transformerFactory = TransformerFactory .newInstance(); //Transformer类用于把代表XML文件的Document对象转 换为某种格式后进行输出 //Transformer对象通过TransformerFactory获得 Transformer transformer = transformerFactory.newTransformer(); //把Document对象又重新写入到一个XML文件中。 transformer.transform(new DOMSource(document),new StreamResult( new File("src//c.xml"))); }
七、XML和HTML的区别: