DOM、SAX和StAX只是解析方式,没有API。
JAXP是SUN提供的一套XML解析API。 JAXP(Java API for XMLProcessing,意为XML处理的Java API)
JAXP很好的支持DOM和SAX解析。
JAXP开发包是JAVASE的一部分,它由java.xml、org.w3c.dom、org.xml.sax包及其子包组成
products.mxl
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEproducts[ <!ELEMENTproducts(product+)> <!ELEMENTproduct(name,price)> <!ELEMENTname(#PCDATA)> <!ELEMENTprice(#PCDATA)> <!ATTLISTproductidID#required> ]> <products> <productid="p001"> <name>往事并不如烟</name> <price>49.9元</price> </product> <productid="p002"> <name>围城</name> <price>59.9元</price> </product> </products>
1、以DOM解析方式读取XML
1.1、根据Id读取一个元素(Element)
packagecom.rk.xml.d_jaxp_dom; importjavax.xml.parsers.DocumentBuilderFactory; importjavax.xml.parsers.DocumentBuilder; importorg.w3c.dom.Document; importorg.w3c.dom.Element; /** *根据Id读取一个元素(Element) *通过Document.getElementById(StringelementId)方法获取一个元素(Element) *@authorRK * */ publicclassDemo01 { publicstaticvoidmain(String[]args)throwsException { //1、新拿到解析器工厂 //2、通过解析器工厂拿到解析器对象 //3、通过解析器对象解析XML文档,并返回Document对象 //4、通过Document对象去获取节点Node //1、新拿到解析器工厂 DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance(); //2、通过解析器工厂拿到解析器对象 DocumentBuilderbuilder=builderFactory.newDocumentBuilder(); //3、通过解析器对象解析XML文档,并返回Document对象 Documentdoc=builder.parse("./src/products.xml"); //4、通过Document对象去获取节点Node Elementelem=doc.getElementById("p001");//必须使用DTD声明ID属性 System.out.println(elem);//[product:null] System.out.println(elem.getNodeType());//1 元素(Element)类型的节点用1表示 System.out.println(elem.getNodeName());//product System.out.println(elem.getNodeValue());//null System.out.println(elem.getTextContent());//往事并不如烟49.9元 } }
1.2、读取一系列节点(NodeList)
packagecom.rk.xml.d_jaxp_dom; importjavax.xml.parsers.DocumentBuilderFactory; importjavax.xml.parsers.DocumentBuilder; importorg.w3c.dom.Document; importorg.w3c.dom.NodeList; importorg.w3c.dom.Node; /** *读取一系列节点(NodeList) *通过Document.getElementsByTagName(Stringtagname)获取一系列节点。 *@authorRK * */ publicclassDemo02 { publicstaticvoidmain(String[]args)throwsException { //1、新拿到解析器工厂 //2、通过解析器工厂拿到解析器对象 //3、通过解析器对象解析XML文档,并返回Document对象 //4、通过Document对象去获取节点Node //1、新拿到解析器工厂 DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance(); //2、通过解析器工厂拿到解析器对象 DocumentBuilderbuilder=builderFactory.newDocumentBuilder(); //3、通过解析器对象解析XML文档,并返回Document对象 Documentdoc=builder.parse("./src/products.xml"); //4、通过Document对象去获取节点Node NodeListlist=doc.getElementsByTagName("product"); System.out.println("找到"+list.getLength()+"个");//找到多少个节点 for(inti=0;i<list.getLength();i++) { Nodenode=list.item(i); System.out.println(node);//将各个节点进行打印 } } }
1.3、读取一个属性(Attribute)
packagecom.rk.xml.d_jaxp_dom; importjavax.xml.parsers.DocumentBuilderFactory; importjavax.xml.parsers.DocumentBuilder; importorg.w3c.dom.Document; importorg.w3c.dom.Node; importorg.w3c.dom.NodeList; importorg.w3c.dom.NamedNodeMap; /** *读取一个属性(Attribute) *@authorRK * */ publicclassDemo03 { publicstaticvoidmain(String[]args)throwsException { DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=builderFactory.newDocumentBuilder(); Documentdoc=builder.parse("./src/products.xml"); NodeListlist=doc.getElementsByTagName("product"); Nodenode=list.item(0); NamedNodeMapmap=node.getAttributes();//获取到所有属性类型的节点 NodeattrNode=map.getNamedItem("id");//获取到属性为“id”的节点 System.out.println(attrNode.getNodeType());//2 属性(Attribute)类型的节点用2表示 System.out.println(attrNode.getNodeName());//id System.out.println(attrNode.getNodeValue());//p001 System.out.println(attrNode.getTextContent());//p001 } }
1.4、读取一个元素的文本(Text)
packagecom.rk.xml.d_jaxp_dom; importjavax.xml.parsers.DocumentBuilderFactory; importjavax.xml.parsers.DocumentBuilder; importorg.w3c.dom.Document; importorg.w3c.dom.NodeList; importorg.w3c.dom.Node; /** *读取一个元素的文本(Text) *@authorRK * */ publicclassDemo04 { publicstaticvoidmain(String[]args)throwsException { DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=builderFactory.newDocumentBuilder(); Documentdoc=builder.parse("./src/products.xml"); NodeListlist=doc.getElementsByTagName("name"); Nodenode=list.item(0); System.out.println(node.getTextContent());//往事并不如烟 } }
1.5、遍历Document对象树
packagecom.rk.xml.d_jaxp_dom; importjavax.xml.parsers.DocumentBuilderFactory; importjavax.xml.parsers.DocumentBuilder; importorg.w3c.dom.Document; importorg.w3c.dom.NodeList; importorg.w3c.dom.Node; importorg.w3c.dom.NamedNodeMap; /** *遍历所有节点 *@authorRK * */ publicclassDemo05 { publicstaticvoidmain(String[]args)throwsException { DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=builderFactory.newDocumentBuilder(); Documentdoc=builder.parse("./src/products.xml"); StringBuildersb=newStringBuilder(); NodeListchildNodes=doc.getChildNodes(); for(inti=0;i<childNodes.getLength();i++) { Nodenode=childNodes.item(i); System.out.println(node.getNodeType()+"==="+node.getNodeName()+"==="+node.getNodeValue()); } /* 输出结果: 10===products===null DOCUMENT_TYPE_NODE=10 1===products===null ELEMENT_NODE=1 */ traverseDocument(doc.getLastChild(),sb); System.out.println(sb.toString()); /* 输出结果: <products> <productid="p001"> <name>往事并不如烟</name> <price>49.9元</price> </product> <productid="p002"> <name>围城</name> <price>59.9元</price> </product> </products> */ } privatestaticvoidtraverseDocument(Nodenode,StringBuildersb) { //1、当前元素开始 sb.append("<"+node.getNodeName()+""); //2、获取属性 if(node.hasAttributes()) { NamedNodeMapnodeMap=node.getAttributes(); for(inti=0;i<nodeMap.getLength();i++) { NodeattrNode=nodeMap.item(i); sb.append(attrNode.getNodeName()+"=\""+attrNode.getNodeValue()+"\""); } } sb.append(">"); //3、获取子节点 NodeListchildNodes=node.getChildNodes(); for(inti=0;i<childNodes.getLength();i++) { NodesubNode=childNodes.item(i); shorttype=subNode.getNodeType(); if(type==1)//当前节点是Element节点 { traverseDocument(subNode,sb); } elseif(type==3)//当前节点是Text节点 { sb.append(subNode.getTextContent()); } else { //其它情况,不做处理 } } //4、当前元素结束 sb.append("</"+node.getNodeName()+">"); } }