1、XML解析,教师:xxx,java解析xml四种方式,DOM (Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的标准接口, DOM采用建立树形结构的方式访问XML文档. SAX(Simple API for XML) 不是某个官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它, SAX解析器采用了基于事件的模型 JDOM(注意JDOM决不是DOM扩展,虽然名字差不多,但两者平行的关系 )是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM的目的是成为Java
2、特定文档模型,它简化与XML的交互并且比使用DOM实现更快 DOM4J具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM(Java API for XML Messaging )也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件.,2,Java技术 + XML,一种完美的组合 Java平台是一种跨平台的编程环境 XML是一种跨平台的数据格式 与其他语言相比,Java平台提供了更好的XML支持,3,
3、DOM,Document Object Model的缩写 通过树型结构存取XML文档 可以在树的某个节点上向前或向后移动 org.w3c.dom.*,4,基于树的处理,使用 DOM 时,数据以类树结构被装入内存中。 DOM 使用根节点和父子关系。,5,DOM 示意,创建的树,输入,6,DOM代码例子,public static void main(String args) /获取 DocumentBuilderFactory 的新实例。DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();/指定由此代码生成的解析器将忽略
4、注释dbf.setIgnoringComments(true);/设置忽略空格dbf.setIgnoringElementContentWhitespace(true);DocumentBuilder db=null;Document document=null; try /获取DocumentBuilder的实例db=dbf.newDocumentBuilder();File file=new File(“D:itcastworkspacexmldomsrccnitcastdomstudents.xml“);document=db.parse(file);,7,DOM代码例子,/按文档顺序返
5、回包含在文档中且具有给定标记名称的所有 Element 的 NodeListNodeList nodeList=document.getElementsByTagName(“name“);for(int i=0;inodeList.getLength();i+)Node node=nodeList.item(i);/输出标记的值System.out.println(node.getFirstChild().getNodeValue(); catch (ParserConfigurationException e) e.printStackTrace(); catch (SAXException
6、 e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); ,8,DOM 的问题,DOM 构建整个文档驻留内存的树。如果文档很大,就会要求有极大的内存。 DOM 创建表示原始文档中每个东西的对象,包括元素、文本、属性和空格。如果您只需关注原始文档的一小部分,那么创建那些永远不被使用的对象是极其浪费的。 DOM 解析器必须在您的代码取得控制权之前读取整个文档。对于非常大的文档,这会引起显著的延迟。,9,SAX,Simple API for XML的缩写 串行存取文档 轻量级、快速 编程较难 仅用于串行存取 org.xml
7、.sax.*,10,SAX,SAX 解析器在解析开始的时候就开始发送事件。当解析器发现文档开始、元素开始和文本等时,代码会收到一个事件。 SAX 解析器根本不创建任何对象,它只是将事件传递给您的应用程序。如果希望基于那些事件创建对象,这将由您来完成。,11,SAX的行为,事件,输入,12,SAX 代码例子,public class SAXReadXML public static void main(String args) /创建SAXParserFactory对象 SAXParserFactory spf=SAXParserFactory.newInstance(); try /创建SAX
8、Parser对象 SAXParser saxParser=spf.newSAXParser(); File file=new File(“D:itcastworkspacexmlSaxsrccnitcastsaxstudents.xml”); /*解析文件 *new XMLContentHandler() 事件处理程序*/ saxParser.parse(file, new XMLContentHandler(); catch (ParserConfigurationException e) e.printStackTrace(); catch (SAXException e) e.print
9、StackTrace(); catch (IOException e) e.printStackTrace(); ,13,SAX 代码例子,public class XMLContentHandler extends DefaultHandler /当前元素中的数据 private String currentData; /取得元素数据 public void characters(char ch, int start, int length) throws SAXException currentData=new String(ch,start,length); /在解析整个文档结束时调用
10、public void endDocument() throws SAXException System.out.println(“结束文档“); /在解析元素结束时调用 public void endElement(String uri, String localName, String name) throws SAXException System.out.println(“节点数据 *“+this.currentData);System.out.println(“结束元素 *“+name); ,14,SAX 代码例子,/在解析整个文档开始时调用 public void startDoc
11、ument() throws SAXException System.out.println(“开始文档“); /在解析元素开始时调用 public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException System.out.println(“开始元素 *“+name); ,15,SAX的优势,这种处理非常象流的好处;可以立即开始分析,而不是必须等待所有要处理的数据。 由于应用程序简单地检查经过其的数据,所以不需要将数据存储在内存里。当遇到大
12、文档时,这是一个突出的优势。 一般来讲,SAX 还比DOM快。,16,SAX的劣势,由于应用程序不以任何方式存储数据,所以,使用 SAX 时,不可能对数据进行更改。,17,SAX VS DOM,选择 DOM 还是 SAX,这取决于几个因素: 应用程序的目的:如果必须对数据进行更改,并且作为 XML 将它输出,则在大多数情况下,使用 DOM。 数据的数量:对于大文件,SAX 是更好的选择。 将如何使用数据:如果实际上只使用一小部分数据,则使用 SAX 将数据抽取到应用程序中,这种方法更好些。 需要速度:通常,SAX 实现比 DOM 实现快。,18,DOM4J解析XML 常用API*,1.getR
13、ootElement():隶属于Document类,返回XML文档的根元素 setRootElement(Element rootElement) :设置给定元素为相应文档的根元素 2. asXML():隶属于Node类,用于将XML转换为String 3.DocumentHelper类常用API: createDocument():创建一个Document对象 parseText(String text):解析给定Xml的文本,生成Document对象,19,DOM4J解析XML 常用API*,3.Element类中常用到API attributeValue(String name) :获取
14、元素String值。 elementIterator() :返回元素的所有子元素的Iterator迭代器。 elements() :返回元素包含所有子元素List。 getParent() :获取父元素Element。 getPath() :获取自己的xpath。 detach() :移除自己。 getName() :获取节点的名称。 selectNodes(String xpathExpression) :通过XPATH获取节点。 selectSingleNode(String xpathExpression) :通过XPATH获取一个节点。 getDocument() :作为一个Docum
15、ent返回。,20,DOM4J,/获取文档 public static Document getDocument() 获取文档SAXReader reader=new SAXReader();File file=new File(“D:itcastworkspacexml_DOM4Jsrccomitcastdaoimplstudents.xml“);Document document=null;try document = reader.read(file); catch (DocumentException e) e.printStackTrace();return document; ,2
16、1,DOM4J,/生成文档 public static void writeDocument2XMLFile(Document document)File file=new File(“D:itcastworkspacexml_DOM4Jsrccomitcastdaoimplstudents.xml“);try OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding(“GB2312“);XMLWriter writer=new XMLWriter(new FileWriter(file),format)
17、;writer.write(document);writer.close(); catch (IOException e) e.printStackTrace(); ,22,DOM4J,/查询所有的 public List selectAllStudent() List studentsList = new ArrayList(); Document document = DocumentManager.getDocument(); Element rootElement = document.getRootElement(); List list = rootElement.elements
18、(); for (int i = 0; i list.size(); i+) Student student = new Student(); Element studentElement = list.get(i); tranElementStudent(studentElement, student); studentsList.add(student); return studentsList; private static void tranElementStudent(Element element, Student student) student.setId(element.at
19、tributeValue(“id“); student.setAge(element.elementText(“age“); student.setName(element.elementText(“name“); student.setAddress(element.elementText(“address“); ,23,DOM4J,/创建文档 public void createXmlDocument(Student student) Document documemt = DocumentHelper.createDocument();Element rootElement = docu
20、memt.addElement(“students“);Element studentElement = rootElement.addElement(“student“).addAttribute(“id“, student.getId();studentElement.addElement(“name“).addText(student.getName();studentElement.addElement(“age“).addText(student.getAge();studentElement.addElement(“address“).addText(student.getAddr
21、ess();DocumentManager.writeDocument2XMLFile(documemt); ,24,DOM4J,/通过属性id查询学生信息 public Student findStudentById(String id) Student student = null;Document document = DocumentManager.getDocument();Element rootElement = document.getRootElement();Node node = document.selectSingleNode(“/students/studentid
22、=“ + id+ “);if (node != null) Element element = (Element) node;student = new Student();tranElementStudent(element, student);return student; ,25,DOM4J,/通过属性name查询学生信息 public Student findStudentByName(String name) Student student = null;Document document = DocumentManager.getDocument();Element rootEle
23、ment = document.getRootElement();Node node = document.selectSingleNode(“/students/studentname=“+ name + “);if (node != null) Element element = (Element) node;student = new Student();tranElementStudent(element, student);return student; ,26,DOM4J,/通过属性name模糊查询学生信息 public List findStudentLikeName(Strin
24、g name) List studentsList = new ArrayList(); Document document = DocumentManager.getDocument(); Element rootElement = document.getRootElement(); List list = document.selectNodes(“/students/studentcontains(name,“ + name + “)“); if (list != null ,27,DOM4J,/通过属性id模糊查询学生信息 public List findStudentLikeNam
25、e(String id) List studentsList = new ArrayList(); Document document = DocumentManager.getDocument(); Element rootElement = document.getRootElement(); List list = document.selectNodes(“/students/studentcontains(id,“ + id + “)“); if (list != null ,28,DOM4J,/通过id属性值更新节点数据 public void updateStudentByID(
26、Student student) Document document = DocumentManager.getDocument(); Element rootElement = document.getRootElement(); Node node = document.selectSingleNode(“/students/studentid=“ + student.getId()+ “); if (node != null) Element element = (Element) node;element.element(“name“).setText(student.getName(
27、);element.element(“age“).setText(student.getAge();element.element(“address“).setText(student.getAddress(); DocumentManager.writeDocument2XMLFile(document); ,29,DOM4J,/通过ID删除一个元素 public void deleteStudentByID(String id) Document document = DocumentManager.getDocument();Element rootElement = document.
28、getRootElement();Node node = document.selectSingleNode(“/students/studentid=“ + id+ “);if (node != null) Element element = (Element) node;rootElement.remove(element);DocumentManager.writeDocument2XMLFile(document); ,30,DOM4J,/往文档中增加记录 public void addStudent2XMLFile(Student student) Document document
29、 = DocumentManager.getDocument(); Element rootElement = document.getRootElement(); Element studentElement=rootElement.addElement(“student“).addAttribute(“id“, student.getId(); studentElement.addElement(“name“).addText(student.getName(); studentElement.addElement(“age“).addText(student.getAge(); studentElement.addElement(“address“).addText(student.getAddress(); DocumentManager.writeDocument2XMLFile(document); ,31,