`

XML(二)

    博客分类:
  • XML
阅读更多
例如:生成以下的文档:
<?xml version="1.0"?>
<people>
 <person>
  <name>zhangsan</name>
  <age>30</age>
  <sex>female</sex>
 </person>
</people>
 在DOM生成XML内容中,所有的元素都应该由Document产生,之后再分别建立各自的关系。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DOMDemo05 {
 public static void main(String[] args) throws Exception {
  // 1、建立DocumentBuilderFactory
  DocumentBuilderFactory factory = null;
  factory = DocumentBuilderFactory.newInstance();
  // 2、建立DocumentBuilder
  DocumentBuilder builder = factory.newDocumentBuilder();
  // 3、建力Document,将整个XML文档形成DOM树
  Document doc = builder.newDocument() ;
  Element peo = doc.createElement("people") ;
  Element per = doc.createElement("person") ;
  Element name = doc.createElement("name") ;
  Element age = doc.createElement("age") ;
  Element sex = doc.createElement("sex") ;
  // 设置节点中的内容
  name.appendChild(doc.createTextNode("zhangsan")) ;
  age.appendChild(doc.createTextNode("30")) ;
  sex.appendChild(doc.createTextNode("female")) ;
  // 设置关系
  per.appendChild(name) ;
  per.appendChild(age) ;
  per.appendChild(sex) ;
  peo.appendChild(per) ;
  doc.appendChild(peo) ;
  NodeList nl = doc.getElementsByTagName("person");
  Element p = (Element) nl.item(0); // 定位节点到person之中
  System.out.println(p.getElementsByTagName("name").item(0)
    .getFirstChild().getNodeValue());
  System.out.println(p.getElementsByTagName("age").item(0)
    .getFirstChild().getNodeValue());
  System.out.println(p.getElementsByTagName("sex").item(0)
    .getFirstChild().getNodeValue());
  
 }
}
 以上的文档都还只是在内存中形成的,可以将其通过IO操作输出到文件之中。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
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;
public class DOMDemo06 {
 public static void main(String[] args) throws Exception {
  // 1、建立DocumentBuilderFactory
  DocumentBuilderFactory factory = null;
  factory = DocumentBuilderFactory.newInstance();
  // 2、建立DocumentBuilder
  DocumentBuilder builder = factory.newDocumentBuilder();
  // 3、建力Document,将整个XML文档形成DOM树
  Document doc = builder.newDocument() ;
  Element peo = doc.createElement("people") ;
  Element per = doc.createElement("person") ;
  Element name = doc.createElement("name") ;
  Element age = doc.createElement("age") ;
  Element sex = doc.createElement("sex") ;
  // 设置节点中的内容
  name.appendChild(doc.createTextNode("张三")) ;
  age.appendChild(doc.createTextNode("30")) ;
  sex.appendChild(doc.createTextNode("female")) ;
  // 设置关系
  per.appendChild(name) ;
  per.appendChild(age) ;
  per.appendChild(sex) ;
  peo.appendChild(per) ;
  doc.appendChild(peo) ;
  TransformerFactory tf = TransformerFactory.newInstance() ;
  Transformer f = tf.newTransformer() ;
  // 设置编码
  f.setOutputProperty(OutputKeys.ENCODING, "GBK") ;
  // 通过DOMSource输出内容
  DOMSource source = new DOMSource(doc) ;
  StreamResult stream = new StreamResult("d:\\abc.xml") ;
  f.transform(source, stream) ;
 }
}
3.2.2、SAX解析
 SAX:简单API XML解析。
 使用顺序的读取方式,部分读取内容。
 在使用SAX之前,首先必须建立好SAX解析器,一个类只要继承了DefaultHandler类,那么此类就可以成为SAX解析器。
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MySAX extends DefaultHandler {
 public void characters(char[] ch, int start, int length) throws SAXException {
  System.out.print(new String(ch,start,length)) ;
 }
 public void endDocument() throws SAXException {
  System.out.println("===== 文档结束 =====");
 }
 public void endElement(String uri, String localName, String qName) throws SAXException {
  System.out.print("</"+qName+">") ;
 }
 public void startDocument() throws SAXException {
  System.out.println("===== 文档开始 =====");
 }
 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  System.out.print("<"+qName+">") ;
 }
}
 下一步开始具体应用此解析器。
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SAXDemo {
 public static void main(String[] args) throws Exception {
  SAXParserFactory factory = null ;
  factory = SAXParserFactory.newInstance() ;
  SAXParser par = factory.newSAXParser() ;
  par.parse(new File("d:\\demo.xml"), new MySAX()) ;
 }
}
 SAX解析操作的时候本身只能提供顺序的读取,但是不具备内容的修改功能。
3.2.3、JDOM
 SAX和DOM都属于标准的操作接口,其本身符合W3C标准,但是因为DOM和SAX两者各有优点和缺点,所以后来开发者开发出了一套新的API —— JDOM,结合DOM的可修改性以及SAX解析的性能高的特点,形成了新的组件。
 Jdom本身是一个单独开发包,jdom也需要一个jar包。
 使用Jdom可以方便的生成XML文件。
<?xml version="1.0"?>
<people>
 <person>
  <name>zhangsan</name>
  <age>30</age>
  <sex>female</sex>
 </person>
</people>
 使用jdom生成以上的内容。
import java.io.FileOutputStream;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
public class JDOMDemo01 {
 public static void main(String[] args) throws Exception {
  Element peo = new Element("people");
  Element per = new Element("person");
  Element name = new Element("name");
  Element age = new Element("age");
  Element sex = new Element("sex");
  name.setText("zhangsan");
  age.setText("30");
  sex.setText("男");
  // 设置关系
  per.addContent(name);
  per.addContent(age);
  per.addContent(sex);
  peo.addContent(per);
  Document doc = new Document(peo);
  // jdom中非常方便的就可以输出内容
  XMLOutputter out = new XMLOutputter();
  out.setEncoding("GBK");
  out.output(doc, new FileOutputStream("d:\\d.xml"));
 }
}
 同样,JDOM中可以使用SAX的解析方式解析XML文件。
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
public class JDOMDemo02 {
 public static void main(String[] args) throws Exception {
  SAXBuilder builder = new SAXBuilder() ;
  Document doc = builder.build("d:\\d.xml") ;
  Element peo = doc.getRootElement() ; // 得到根节点
  System.out.println(peo.getChild("person").getChildText("name")) ;
  System.out.println(peo.getChild("person").getChildText("age")) ;
  System.out.println(peo.getChild("person").getChildText("sex")) ;
 }
}
 如果现在在一个people元素中有多个person节点,则此时就可以发现Jdom所具备的优点了。
<?xml version="1.0" encoding="GBK"?>
<people>
 <person>
  <name>zhangsan</name>
  <age>30</age>
  <sex>男</sex>
 </person>
 <person>
  <name>lisi</name>
  <age>31</age>
  <sex>女</sex>
 </person>
</people>
 解析如下:
import java.util.Iterator;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
public class JDOMDemo03 {
 public static void main(String[] args) throws Exception {
  SAXBuilder builder = new SAXBuilder() ;
  Document doc = builder.build("d:\\d.xml") ;
  Element peo = doc.getRootElement() ; // 得到根节点
  Iterator iter = peo.getChildren().iterator() ;
  while(iter.hasNext()){
   Element ele = (Element)iter.next() ;
   System.out.print(ele.getChildText("name")+";") ;
   System.out.print(ele.getChildText("age")+";") ;
   System.out.print(ele.getChildText("sex")+"\n") ;
   System.out.print("=================================") ;
  }
 }
}
3.3、HTML中使用DOM解析
有如下的XML文件:
<?xml version="1.0" encoding="GBK"?>
<allplus>
 <plus>
  <id>1</id>
  <title>北京</title>
 </plus>
</allplus>
 使用AJAX读取内容
<html>
 <head>
  <title>dom01.htm</title>
  <script language="javaScript">
   var xmlHttp ;
   function createXmlHttp(){
    if(window.XmlHttpRequest){
     xmlHttp = new XmlHttpRequest() ;
    }else{
     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP") ;
    }
   }
   function getContent(){
    createXmlHttp() ;
    xmlHttp.onreadystatechange = getContentCallback ;
    xmlHttp.open("POST","data.xml") ;
    xmlHttp.send(null) ;
   }
   function getContentCallback(){
    if(xmlHttp.readyState==4){ // 数据已经全部读取完毕
     // 从读取的内容中解析出xml文件
     var root = xmlHttp.responseXML.getElementsByTagName("allplus")[0].childNodes ;
     // 把内容读取出来
     for(var i=0;i<root.length;i++){
      var plus = root[i] ;
      alert(plus.getElementsByTagName("id")[0].firstChild.nodeValue + " --> " +
       plus.getElementsByTagName("title")[0].firstChild.nodeValue) ;
     }
    }
   }
  </script>
 </head>
 <body>
  <input type="button" value="按我" onClick="getContent()">
 </body>
</html>
 直接通过JavaScript生成一个下拉列表框。
<html>
 <head>
  <title>dom01.htm</title>
  <script language="javaScript">
   function fun(){
    var select = document.getElementById("plus") ;
    select.length = 1 ;   // 每次只能选择一个内容
    select.options[0].selected = true ;  // 第一个被默认选中
    var id = 1 ;
    var title = "北京" ;
    var option = document.createElement("option") ;
    option.setAttribute("value",id) ;
    option.appendChild(document.createTextNode(title)) ;
    select.appendChild(option) ;
   }
  </script>
 </head>
 <body>
  <form>
   <select name="plus" id="plus">
    <option value="0">没有地区</option>
   </select>
   <input type="button" value="按我" onClick="fun()">
  </select>
 </body>
</html>
 以上代码发现,HTML中也是可以使用DOM解析操作的。
4、总结
 1、 DOM与SAX解析各自的优点及缺点
 2、 灵活使用Jdom解析输出
 3、 可以直接使用AJAX读取XML文件格式的内容
 4、 HTML中的所有元素都可以使用DOM解析操作
5、预习任务
 1、 Hibernate入门
6、作业
 使用Struts + AJAX + Jdom + XML生成一个级联菜单,依然使用地区-子地区操作
 • Struts中使用DAO可以取出全部的子地区,根据地区编号取
 • 在Action中使用内存输出流,将所有的子地区生成一个XML风格的文件
  |- 内存输入、输出流:ByteArrayOutputStream、ByteArrayInputStream
 • 前台的HTML页面中可以列出全部的地区,之后地区改变,可以通过AJAX取出全部的子地区
 • 子地区使用JavaScript进行DOM解析,从返回的XML文件里取出全部的内容
 • 注意:所有生成的XML文件都不能以文件的形式出现。
分享到:
评论

相关推荐

    CSS+JQuery+XML二级菜单

    在这个"CSS+JQuery+XML二级菜单"的示例中,我们将深入探讨这三种技术如何协同工作来实现这一功能。 首先,CSS(层叠样式表)是网页设计的基础,用于定义页面元素的样式,如字体、颜色、布局等。在二级菜单的设计中...

    命令行修改Android apk包xml二进制文件

    本篇将详细讲解如何在命令行环境下对Android APK包内的XML二进制文件进行修改。 首先,我们需要了解APK的结构。APK文件实际上是一个ZIP压缩包,包含Dalvik字节码(DEX文件)、资源文件(res目录)、XML布局文件...

    dropdownlist&xml二级联动

    ### dropdownlist&xml二级联动知识点解析 #### 一、知识点概述 在Web开发中,有时我们需要实现一个下拉列表(dropdownlist),并且当用户选择其中一个选项时,另一个下拉列表会根据用户的选择动态地更新其内容。...

    \"java xml 二\"之Schema总结

    "Java XML 二"之Schema总结,主要关注的是XML Schema,它是XML文档结构和数据类型的一种规范,用于提供比DTD(Document Type Definition)更强大的验证功能。以下是对该主题的详细概述: 1. **XML Schema定义** ...

    二进制AndroidManifest.xml修改神器~

    本资源,"二进制AndroidManifest.xml修改神器~",提供了一种工具——AXMLTWOEditor,用于直接修改二进制格式的`AndroidManifest.xml`文件。 通常情况下,`AndroidManifest.xml`以文本形式存在,开发者可以使用XML...

    二进制XML存储方案

    二进制XML存储方案BinXML实现方法 BinXML是我个人杜撰出来的名字,不知道是否合适,也不知道是否已存在类似的解决方案。在vcer.net上我将前一段时间的这个BinXML方案贡献出来,希望能够与广大vcer分享。 当时问题的...

    maven的本地仓库配置文件settings.xml和项目中文件pom.xml.zip

    二、Myeclipse关联的maven本地仓库配置文件settings.xml (1)可自定义文件名 D:\developsoft\javaweb\commonPlugins\maven\apache-maven-3.8.1_first\conf\settings_Myeclipse1.xml 三、3个可单独使用的,maven项目...

    AMXLPrinter2用于把二进制的XML转为文本

    **AMXLPrinter2:二进制XML到文本的转换工具** 在移动应用开发,特别是针对Android平台时,理解和分析APK文件内部结构是常见的需求。其中,XML文件扮演着核心角色,存储了应用的布局、资源和配置信息。然而,为了...

    对tinyxml库封装

    描述: 对tinyxml库封装的简单类: 1,创建、保存xml 2,动态创建节点,更改名称以及值;动态删除 3,动态增加、删除属性,遍历、读取属性名称以及值 背景: tinyxml对xml操作的接口过于分散,为了适应自己的需要,...

    xml binary soap 序列化

    为了解决这个问题,出现了XML二进制序列化和SOAP二进制编码,以提高传输速度和减少带宽消耗。 1. XML二进制序列化:这是将XML数据转换成二进制格式的过程,目的是减少数据的大小,从而提高网络传输效率。常见的XML...

    读取目录中的xml文件并写入Excel

    **步骤二:解析XML数据** 解析XML数据通常涉及到XPath或LINQ to XML。XPath是一种在XML文档中查找信息的语言,而LINQ to XML提供了更面向对象的查询方式。根据XML文件结构,你可以选择合适的方法来提取所需数据。 ...

    xml2axml.jar工具 AndroidManafest

    通过xml2axml.jar工具反编译AndroidManafest文件将整个axml二进制文件解码为常规xml保存为文件,再将xml编码为axml二进制文件,还是很好用的,axml文件我在idea中打开也是乱码,只能求助工具反编译。

    省市二级3种实现方法(XML、JS、SQL).rar

    综上所述,XML、JS和SQL是实现省市二级联动的常见技术手段。XML用于结构化数据,JS负责前端交互,SQL则用于后台数据的管理和查询。根据项目需求和技术栈,可以选择合适的方法来实现这一功能。在实际应用中,可能会...

    PHP二维数组形成XML内容形式

    当涉及到二维数组时,我们经常需要将这些数据转化为XML,以便与不同的系统或服务进行数据交换。XML(Extensible Markup Language)是一种用于存储和传输数据的标准格式,它允许我们以结构化的方式组织信息。在这个...

    xml第二次作业

    【XML第二次作业详解】 XML(eXtensible Markup Language)是一种用于标记数据的语言,它允许开发者自定义标签来描述数据的结构和意义。本作业主要涉及XML的基本应用,包括创建XML文档、定义DTD(Document Type ...

    APK反编译工具包(dex/jar/xml )

    axml printer2.jar能够将.axml二进制文件转换为可读的XML格式,帮助开发者查看和修改应用的用户界面设计。 反编译APK的过程大致如下: 1. 使用解压工具将APK文件解压,获取到里面的classes.dex文件。 2. 运行dex2...

    XML第二章学习中XML第二章学习中

    XML,全称Extensible Markup Language,是一种用于存储和传输数据的标记语言。它以其结构化、自描述性和可扩展性而被广泛应用于网络数据交换、配置文件存储、电子出版等领域。在XML的学习过程中,理解其基本语法至关...

    XML索引技术

    #### 二、XML索引技术概述 XML索引技术主要关注如何为XML文档建立有效的索引结构,以便于快速定位和检索文档中的相关信息。一个高效的XML索引不仅能够显著提高查询响应速度,还能够支持复杂查询需求,如路径查询、...

    基于tinyxml2的xml操作库再封装

    本项目是基于tinyxml2进行的二次封装,旨在进一步简化XML的操作,提供更友好的API,提升开发效率。 在C++中,原始的tinyxml2库可能需要用户手动处理许多底层细节,如节点遍历、属性获取等。通过对tinyxml2的封装,...

Global site tag (gtag.js) - Google Analytics