一、XML解析技术概述@H_404_3@
XML解析方式分为两种:dom和sax
dom:(Document Object Model,即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。
sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。
XML解析器
Crimson、Xerces 、Aelfred2
@H_404_3@
二、获得JAXP中的DOM解析器
调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表@H_404_3@
整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。@H_404_3@
更新XML文档:利用Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:javax.xml.transform.dom.DOMSource类来关联要转换的document对象,用javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。
Transformer对象通过TransformerFactory获得。@H_404_3@
三、使用dom方式对xml文档进行crud@H_404_3@
/**
* 读取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对象获取一些相关的信息
@H_404_3@
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文档的内容了。
@H_404_3@
@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的区别: