日期:2014-05-20 浏览次数:20903 次
InputStream in = MyXMLReaderDOM4J.class.getClassLoader() .getResourceAsStream("resource.xml"); SAXReader reader = new SAXReader(); Document doc = reader.read(in); Element root = doc.getRootElement(); for (Object o : (List<?>) root.elements("类型")) { Element e = (Element) o; System.out.print("言情小说:" + e.elementText("言情小说")); System.out.println(" 书名:" + e.elementText("v")); }
------解决方案--------------------
xml的解析 1.解析式为了得到里面的内容,进行增,删,改查的操作 XML的解析方式 SAX(Simple API for XML)xml文档的一种简单的解析方式 DOM(Document Object Model) DOM4J SAX:基于事件的解析方式 DOM: 基于对象的解析方式 事件监听三要素 1.事件源 2.监听器 3.事件 SAX 基于事件的解析 优点: 简单 效率高 缺点:顺序执行,不能得到某个元素 不能逆向执行 不能进行增,与删的操作 SAX解析方式工作原理: 通过时间源xml文档创建SAXParseFactory SAXParserFactory factory=SAXParserFactory.newInstance(); 得到一个解析器 SAXParser parse=factory.newSAXParser(); 对xml文件进行解析 得到解析的文件对象 File file=new File("employees.xml"); 通过监听器进行解析 MyListener listener=new MyListener(); parse.parse(file,listener); 对于监听器有5个方法:监听器所在的类实现的接口有: org.xml.sax.hepers.DefaultHandler org.xml.sax 通过查看API文档中的DefaultHandler类中的下面5个方法 startDocument() 对于文档开始的解析 public void startDocument()throws SAXException{ System.out.println("文档开始解析啦!!!!"); } startElement()元素开始的解析其中几个名词 url:命名空间的url localName:命名空间的前缀 qName:元素 attributes:元素里的属性 public void startElement(String url,String localName,String qName,Attributes attributes)throws SAXException{ StringBuffer sb=new StringBuffer(); sb.append("<"+qName); for(int i=0;i<attributes.getLength();i++){ String attName=attributes.getQName(i);获得元素属性名称其中的i为元素的第几个属性 String attValue=attributes.getValue(i);获得元素属性的值其中的i为元素的第几个属性的值 sb.append(attName+"="+attValue); } sb.append(">"); System.out.print(sb.toString()); } character()获得元素的内容体 public void characters(char[]ch,int start,int length)throws SAXException{ System.out.print(new String(ch,start,length)); } endElement()获得元素的结束事件 public void endElement(String url,String localName,String qName)throws SAXException{ System.out.print("</"+qName+">"); } endDocument()获得文档的结束事件 public void endDocument(){ System.out.println("文档解析结束啦!!!!"); } 对于SAX解析只能逐行解析不能越行解析 DOM:基于对象的 优点:灵活,能进行增删的操作 缺点:读取速度慢,效率低 占用的内容多 对于DOM解析:不需要添加监听器,按级解析从根元素、一级子元素、二级子元素...... 同SAX解析相同刚开始也是要得到一个解析器; DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance() ; 因为构造方法不可用不可以new对象只能用newInstance()方法得到解析器对象 DocumentBuilder builder=factory.newDocumentBuilder() ;得到一个解析器 对于document可以有两种方法得到: Document document= builder.parse(new File(文件路径));通过parse方法解析一个已有的xml文档 Document document=builder.newDocument();可以得到一个空的document对象 得到根节点 Element root=document.getDocumentElement(); 如果不存在根节点即为一个空document对象的时候只能添加跟节点 Element root=document.createElement(根节点的名字) 得到根节点下面的所有一级子元素 NodeList list=root.getElementsByTagName(根节点的名字可以用root.getTagName或者root.getNodeName()得到根节点的名字)(); { 对与document可以添加一级子元素 不管document是否为空都可以添加 Element firstElements =root.creatElement(一级子元素的名字); 当然也可以为一级子元素添加属性 一级子元素的名字.setAttribute("属性名","属性值"); } 通过遍历list集合 for(int i=0;i<list.getLength();i++){ Element first_elements=(Element)list.item(i); 可以得到一级资源的属性的值当知道属性的时候 String attribute=first_elements.getAttribute("属性的名字"); 得到一级子元素的名字 String first_elements_name=first_elements.getNodeName(); 得到一级子元素下面所有的元素如id 第一个id元素当然也可有很多个id 通过item()来确定要取那个id Element id_element=(Element)first_elements.getElementByName("id").item(0); 得到id的值 String id_value=id_element.getFirstChild().getTextContent(); 通过这个遍历集合可以拿到所有子元素 } DOM添加或删除元素: DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance() ; 因为构造方法不可用不可以new对象只能用newInstance()方法得到解析器对象 DocumentBuilder builder=factory.newDocumentBuilder() ;得到一个解析器 对于document可以有两种方法得到: Document document= builder.parse(new File(文件路径));通过parse方法解析一个已有的xml文档 Document document=builder.newDocument();可以得到一个空的document对象 得到根节点 Element root=document.getDocumentElement(); 如果不存在根节点即为一个空document对象的时候只能添加跟节点 Element root=document.createElement(根节点的名字) 对与document可以添加一级子元素 不管document是否为空都可以添加 Element firstElements =root.creatElement(一级子元素的名字); 当然也可以为一级子元素添加属性 一级子元素的名字.setAttribute("属性名","属性值"); 添加二级子元素 Element secondElements=firstElements.creatElement("二级子元素的名字"); 挂载组装 一级子元素firstElements.append(secondElements); 根节点root.appendChild(firstElements); 将document对象树写入磁盘 TransformerFactory tf=TransformerFactory.newInstance(); Transformer former=tf.newTransformer(); DOMSource source=new DOMSource(document); StreamResult result= new StreamResult(new File("10.xml"));结果集 former.transform(source,result); 完毕 DOM4j需要借助外部jar包 需要借助外部jar包就必须设置环境变量中的classpath把classpath设置成 dom4j jar包存在的路径(绝对路径) 例如: set classpath=.;C:\Documents and Settings\Administrator\桌面\day3\dom4j.jar import org.dom4j.io.*; import java.io.*; import java.util.*; import org.dom4j.*; public static void read_XML(String fileName){ try{ //得到一个解析器,相当于SAX,DOM里面的解析器工厂,与解析器 SAXReader reader=new SAXReader(); //得到一个对象树 Document document=reader.read(new File(fileName)); //得到一个根元素 Element root=document.getRootElement(); System.out.println(root.getName()); //得到所有的一级子元素 List firstElements=root.elements(); Iterator it=firstElements.iterator(); while(it.hasNext()){ //依次得到每一个一级子元素 Element firstElement=(Element)it.next(); System.out.println(firstElement.getName()); //得到所有的属性 List attributes=firstElement.attributes(); for(Object obj:attributes){ //依次得到每一个属性 Attribute att=(Attribute)obj; System.out.println(att.getName()+"="+att.getValue()); } //得到一级子元素下面的所有元素,及其附带值 List second_Elements=firstElement.elements(); Iterator second_Element=second_Elements.iterator(); while(second_Element.hasNext()){ Element sec_Element=(Element)second_Element.next(); System.out.println(sec_Element.getName()+":"+sec_Element.getText()); } System.out.println("----------"); } }catch(Exception e){ } } public static void write(String fileName){ try{ Document document = DocumentHelper.createDocument(); //创造一级子元素 Element books=document.addElement("books"); books.addComment("The book is J2EE"); Element book=books.addElement("book"); 创建元素的属性 book.addAttribute("show","yes"); book.addAttribute("page","100"); 创建二级子元素 Element book_name=book.addElement("bookName"); 创建元素的内容体 book_name.setText("xml"); Element book_price=book.addElement("bookPrice"); book_price.setText("3000"); Element book_press=book.addElement("bookPress"); book_press.setText("etoak"); Element book_author=book.addElement("bookAuthor"); book_author.setText("Robin"); //挂载另一个一级子元素 book=books.addElement("book"); book.addAttribute("show","NO"); book.addAttribute("page","200"); book_name=book.addElement("bookName"); book_name.setText("葵花宝典"); book_price=book.addElement("bookPrice"); book_price.setText("无价之宝"); book_press.addElement("bookPress"); book_press.setText("华山派"); book_author=book.addElement("bookAuthor"); book_author.setText("林平之"); //创建xml文件输出的路径 OutputFormat format=OutputFormat.createPrettyPrint(); format.setEncoding("gbk"); XMLWriter xw=new XMLWriter(new FileOutputStream(fileName), format); //XMLWriter xx= new XMLWriter(System.out,OutputFormat.createPrettyPrint()); xw.write(document); xw.flush(); xw.close(); }catch(Exception e){ 对于DOM4j添加子元素,是一级一级的添加的而在DOM中是先创造 子元素然后再挂载的DOM4j在创建子元素的时候就确定好了顺序 对于文件的输出各有千秋各有特色其中SAX是需要添加监听器的 } } public static void update(String fileName){ try{ SAXReader reader= new SAXReader(); Document document = reader.read(new File(fileName)); Element root = document.getRootElement(); System.out.println(root.getName()); 在根节点上添加一级子元素 Element student=root.addElement("student"); Element id=student.addElement("id"); id.setText("007"); OutputStream os= new FileOutputStream(fileName); OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter xw = new XMLWriter(os,format); xw.write(document); xw.flush(); xw.close(); }catch(Exception e){ 和创建一个新的document对象类似只不过这个的根节点已经存在 直接可以在根节点上添加一级子元素; } }