解析xml主要有两种方式,一种是dom方式,一种是sax的方式。
1.dom方式是将xml数据作为一个对象生成一个树状结构放入内存中,
(1)优点:方便对xml中的数据进行增删改,是W3C推荐的处理xml数据的方式
(2)缺点:这种方式不利于读取比较大的xml文件,容易造成内存溢出。
2.sax方式是采用事件驱动,边读边解析,从上往下,一行一行的解析的方式进行操作
(1)优点:在处理比较大的xml文件时不会造成内存溢出的情况
(2)缺点:不能实现增删改的操作,不是官网标准,但是几乎所有的xml解析器都支持它
3.本文暂时先选取三种主要的解析器中的一种解析器jaxp的方式来解析xml数据,主要的三个解析器为:
(1)sun公司提供的jaxp
(2)dom4j组织提供的dom4j(用的最多)
(3)jdom组织提供的jdom
以下是对xml数据的增删改查操作的代码:代码中有注释
package ng.www.jaxp; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.SAXException; /** * 实现jaxp操作xml * @author WangWeiWei * */ public class TestJaxp { /** * @param args * @throws ParserConfigurationException * @throws IOException * @throws SAXException * @throws TransformerException */ public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException { //addNode(); //editNode(); //deleteNode(); //selectSin(); transervalNode(); //selectAll(); } private static void transervalNode() throws ParserConfigurationException, SAXException, IOException { /* * 此处是遍历xml的节点 */ DocumentBuilderFactory builderFactory =DocumentBuilderFactory.newInstance(); DocumentBuilder builder=builderFactory.newDocumentBuilder(); Document document=builder.parse("src/person.xml"); //编写一个方法实现遍历操作 list1(document); } private static void list1(Node node) { if(node.getNodeType()==Node.ELEMENT_NODE){ System.out.println(node.getNodeName()); } //得到一层子节点 NodeList nodelist= node.getChildNodes(); for(int i=0;i<nodelist.getLength();i++){ //得到每一个节点 Node node1=nodelist.item(i); list1(node1); } } private static void deleteNode() throws ParserConfigurationException, SAXException, IOException, TransformerException { /* * 此处是删除xml的节点 */ DocumentBuilderFactory builderFactory =DocumentBuilderFactory.newInstance(); DocumentBuilder builder=builderFactory.newDocumentBuilder(); Document document=builder.parse("src/person.xml"); //获取sex元素 Node node=document.getElementsByTagName("sex").item(0); Node parentNode=node.getParentNode(); parentNode.removeChild(node); //回写到本地xml文件中 TransformerFactory factory=TransformerFactory.newInstance(); Transformer former=factory.newTransformer(); former.transform(new DOMSource(document), new StreamResult("src/person.xml")); } private static void editNode() throws ParserConfigurationException, SAXException, IOException, TransformerException { /* * 编辑xml数据(修改sex下的文本数据为nan) * 使用sexTextContent方法 */ DocumentBuilderFactory builderFactory =DocumentBuilderFactory.newInstance(); DocumentBuilder builder=builderFactory.newDocumentBuilder(); Document document=builder.parse("src/person.xml"); //获取sex的节点 Node sexNode = document.getElementsByTagName("sex").item(0); sexNode.setTextContent("nan"); //内存中已经修改完毕,现在需要将内存中的数据回写到本地xml文件中才会生效 TransformerFactory factory=TransformerFactory.newInstance(); Transformer former=factory.newTransformer(); former.transform(new DOMSource(document), new StreamResult("src/person.xml")); } private static void addNode() throws ParserConfigurationException, SAXException, IOException, TransformerException{ /* * 这里操作需要会写xml,要不然只是在内存中修改了xml数据,本地文件不会有改变 */ DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=builderFactory.newDocumentBuilder(); Document document=builder.parse("src/person.xml"); Node node=document.getElementsByTagName("p1").item(0); Element element=document.createElement("sex"); Text text= document.createTextNode("nv"); element.appendChild(text); node.appendChild(element); //会写xml数据到本地中 TransformerFactory formerFactory=TransformerFactory.newInstance(); Transformer former= formerFactory.newTransformer(); former.transform(new DOMSource(document), new StreamResult("src/person.xml")); } private static void selectSin() throws ParserConfigurationException, SAXException, IOException{ /* * 1.创建解析器工厂 * 2.根据解析器工厂创建解析器 * 3.解析xml,返回document * 4.得到所有的name元素 * 5.利用返回的集合里面的item(0)来获得第一个name元素 * 6.使用getTextContext方法来获得具体的值 */ //创建解析器工厂 DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance(); //根据解析器工厂创建一个解析器 DocumentBuilder builder=builderFactory.newDocumentBuilder(); //根据解析器来返回xml的document对象 Document document=builder.parse("src/person.xml"); //根据document对象来获取所有的name元素,然后利用item(0)获取第一个元素 Node node=document.getElementsByTagName("name").item(1); String s=node.getTextContent(); System.out.println(s); } private static void selectAll() throws ParserConfigurationException, SAXException, IOException { // 查询xml中所有标签为name的值 /* * 1.创建解析器工厂 * 2.根据解析器工厂创建解析器 * 3.解析xml返回document * 4.得到所有的name元素 * 5.遍历集合,得到每一个name元素 */ //创建解析器工厂 DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance(); //创建解析器 DocumentBuilder builder=builderFactory.newDocumentBuilder(); //解析xml返回document Document document= builder.parse("src/person.xml"); NodeList list = document.getElementsByTagName("sex"); //遍历开始 for(int i=0;i<list.getLength();i++){ Node name1= list.item(i); //得到那么里面元素的值 String nametext= name1.getTextContent(); System.out.println(nametext); } } }
一下是对应的操作的xml文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person> <p1> <name>wangweiwei</name> <age>23</age> <sex>nv</sex> </p1> <p1> <name>haha</name> <age>30</age> </p1> </person>
时间: 2024-10-19 23:49:33