随笔 - 3, 文章 - 152, 评论 - 17, 引用 - 0
数据加载中……

Java与XML(一)基础

JAXP API--嵌入不同的解释器

SAX解释器+DOM解释器+XSL转换器

javax.xml.parsers中加载XML文档的类:
DocumentBuilder
DocumentBuildrFactory
SAXParser
SAXParserFactory
=====================================
SAX API

SAX的XML解释器:Apache的Xerces或Crimson

处理XML文档的接口:
ContentHandler
EntityResolver
ErroHandler
DTDHandler

DeclHandler
LexicalHandler
======================================
DOM API

两个DOM标准:DOM Level1 DOM Level 2 Core

节点
Node-节点类型接口层次结构的根。
Document-树结构的根
Element-XML元素
Text-元素内的文本
Attr-元素的特性
CDATA Sectionn-CDATA
NodeList-子节点的集合
ProcessingInstruction-指令
Comment-包含注释的信息
DocumentFragment-Document的消减版,用于在树中移动节点
DocumentType-文档类型定义的子集。
Entity-DTD中的实体标记
EntityReference-XML文档中的实体引用
Notation-DTD中的符号标记


从程序中读取X M L文档基本上有三种方式:
1把X M L只当做一个文件读取,然后自己挑选出其中的标签。这是黑客们的方法,我们不推荐这种方式。
你很快会发现处理所有的特殊情况(包括不同的字符编码,例外约定,内部和外部实体,缺省属性等)比想象的困难得多;
你可能不能够正确地处理所有的特殊情况,这样你的程序会接收到一个非常规范的X M L文档,却不能正确地处理它。
要避免这种想法:XML解析器似乎并不昂贵(大多数是免费的)。
2可以用解析器分析文档并在内存里创建对文档内容树状的表达方式:解析器将输出传递给文档对象模型,即DOM。
这样程序可以从树的顶部开始遍历,按照从一个树单元到另一个单元的引用,从而找到需要的信息。
3也可以用解析器读取文档,当解析器发现标签时告知程序它发现的标签。
例如它会告知它何时发现了一个开始标签,何时发现了一些特征数据,以及何时发现了一个结束标签。
这叫做事件驱动接口,因为解析器告知应用程序它遇到的有含义的事件。
如果这正是你需要的那种接口,可以使用SAX。

SAX是只读的
DOM可以从XML原文件中读取文档,也可以创建和修改内存中的文档。相比较而言,SAX是用来读取XML文档而不是书写文档。

可扩展样式语言(XSL,eXtensible Sytlesheet Language)是一种基于XML的语言,
它被设计用来转换XML文档到另一种XML文档或转换XML文档为可翻译对象。
原始的XSL语言已经被分割成三种不同的语言:
1转换工具(XSLT)是一种转换XML文档到其他XML文档的语言
2翻译工具(XSLF—可以包括X S LT的使用)
3XML分级命令处理工具(XPath)
XSL有它自已的根,不管是在层叠样式表(CSS)中还是在一种叫DSSSL(文档样式语义和规格语言—读为'deessel')的语言中。
随着它的发展,XSL的样式表现变得更接近于CSS和远离DSSSL

================================================================================

Java与XML(二)用java编写xml的读写程序

这是读取xml文件的java程序,我调试好的。采用的是dom方式读取xml文件到Vector中。
package src;
import java.io.*;
import java.util.Vector;
import javax.xml.parsers.*;
import org.w3c.dom.*;
public class readxml {
 static Document document;
 private boolean validating;
 public readxml() {
 }
 public Vector toRead(String filename) {
  Vector title=new Vector();
  Vector content=new Vector();
  String myStr=new String();
  try {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(validating);
   DocumentBuilder builder = factory.newDocumentBuilder();
   document = builder.parse(new File(filename));
   document.getDocumentElement().normalize();
   Node node = document.getFirstChild();
   NodeList list = node.getChildNodes();
   for (int i = 0; i < list.getLength(); i++) {
    Node nodeitm = list.item(i);
    if (nodeitm.getNodeName().equals("Title")) {
     myStr=nodeitm.getFirstChild().getNodeValue();
     title.addElement(myStr);//getFirstChild()
    }
    if (nodeitm.getNodeName().equals("Content")) {
     myStr=nodeitm.getFirstChild().getNodeValue();
     content.addElement(myStr);
    }
   }
  } catch (Exception exp) {
   exp.printStackTrace();
   return null;
  }
  Vector all=new Vector();
  all.add(title);
  all.add(content);  
  return all;
 }

 public static void main(String[] args) {
  Vector A;
  readxml my = new readxml();
  A = my.toRead("f:\\tomcat5\\webapps\\myxml\\xmldata\\9.xml");
  for (int i = 0; i < A.size(); i++) {
   System.out.println(A.elementAt(i));
  }
 }
}
这是将xml写入文件。其中,transformer.setOutputProperty(OutputKeys.ENCODING,"GB2312")关系到编码问题,非常重要。
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
public class writexml {
 private Document document;
 private String filename;
 
 public writexml(String name) throws ParserConfigurationException{
  filename=name;
  DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  DocumentBuilder builder=factory.newDocumentBuilder();
  document=builder.newDocument();
 }
 public void toWrite(String mytitle,String mycontent){
      Element root=document.createElement("WorkShop");
  document.appendChild(root);
  Element title=document.createElement("Title");
  title.appendChild(document.createTextNode(mytitle));
  root.appendChild(title);
  Element content=document.createElement("Content");
  content.appendChild(document.createTextNode(mycontent));
  root.appendChild(content);
  }
 public void toSave(){
  try{
   TransformerFactory tf=TransformerFactory.newInstance();
   Transformer transformer=tf.newTransformer();
   DOMSource source=new DOMSource(document);
   transformer.setOutputProperty(OutputKeys.ENCODING,"GB2312");
   transformer.setOutputProperty(OutputKeys.INDENT,"yes");
   PrintWriter pw=new PrintWriter(new FileOutputStream(filename));
   StreamResult result=new StreamResult(pw);
   transformer.transform(source,result);
  }
  catch(TransformerException mye){
   mye.printStackTrace();
  }
  catch(IOException exp){
   exp.printStackTrace();
  }
 }
 public static void main(String args[]){
  try{
  writexml myxml=new writexml("f:\\tomcat5\\webapps\\myxml\\xmldata\\9.xml");
  myxml.toWrite("中文题目","中文内容");
  myxml.toSave();
  System.out.print("Your writing is successful.");
  }
  catch(ParserConfigurationException exp){
   exp.printStackTrace();
   System.out.print("Your writing is failed.");
  }  
 }
}

=================================================================================

利用(二)中我写的两个函数(放在package src中),这次实现web页面的操作。
index.html:
<%@ page language="java" pageEncoding="GB2312"%>
<body>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table width="60%" border="1" align="center">
  <tr>
    <td>
      <p align="left"><font size="4" color="#003399">管理测试程序</font></p>
     
      <form name="readform" method=post action="load.jsp">
        <p align="left"><font color="#FF0000">读取xml文件: </font></p>
        <p align="left"> <font color="#FF0000">
          <input type="text" name="mypath" size="50" value="c:\\eclipse\\workspace\\myxml\\xmldata\\1.xml">
          </font></p>
        <p align="left">
        <a href="#" onClick=submit()>读取</a>
        </p>
        <p align="left">&nbsp;</p>
      </form>
     
      <form name="writeform" method=post action="create.jsp">
        <p align="left"><font color="#FF0000">写入xml文件:</font> </p>
        <p align="left">请填写路径:
          <input type="text" name="mypath" width="100" size="50"
          value="c:\\eclipse\\workspace\\myxml\\xmldata\\11.xml">
        </p>
        <p align="left">请填写题目:
          <input type="text" name="mytitle" width="100" size="50">
        </p>
       
        <p align="left">请填写内容:
          <textarea name="mycontent" cols="100"></textarea>
        </p>
        <p align="left">
        <a href="#" onClick=submit()>写入</a>
        </p>
      </form>
</td>
  </tr>
</table>
</body>

写入的页面create.jsp
<%@ page language="java" pageEncoding="GB2312"%>
<%@ page import="src.*" %>
<%@ page import="org.w3c.dom.*"%>
<%@ page import="javax.xml.parsers.*"%>
<%@ page import="javax.xml.transform.*"%>
<%@ page import="javax.xml.transform.dom.DOMSource"%>
<%@ page import="javax.xml.transform.stream.StreamResult"%>
<%@ page import="java.io.*"%>
<html>
<body>
<%
String mypath=(String)request.getParameter("mypath");
String mytitle=(String)request.getParameter("mytitle");
String mycontent=(String)request.getParameter("mycontent");

mypath=new String(mypath.getBytes("ISO-8859-1"),"GB2312");
mytitle=new String(mytitle.getBytes("ISO-8859-1"),"GB2312");
mycontent=new String(mycontent.getBytes("ISO-8859-1"),"GB2312");
try{
writexml myxml=new writexml(mypath);
myxml.toWrite(mytitle,mycontent);
myxml.toSave();
out.print("Your writing is successful.");
}
catch(ParserConfigurationException exp){
 exp.printStackTrace();
 out.print("Your writing is failed.");
}
%>
</body>
</html>


读取xml的页面load.jsp:
<%@ page language="java" pageEncoding="GB2312"%>
<%@ page import="src.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.Vector" %>
<%@ page import="javax.xml.parsers.*" %>
<%@ page import="org.w3c.dom.*" %>
<html>
<body>
<%
Vector A=new Vector();
String mypath=(String)request.getParameter("mypath"); 
out.println(mypath);%>
<p>
<%
readxml my = new readxml();
A = my.toRead(mypath);
for (int i = 0; i < A.size(); i++) {
out.println(A.elementAt(i));
%>
<p>
<%
}
%>
</body>
</html>
这个写程序还有一个缺陷,它只是创建xml格式和内容,而不是改写已有文件。
如果您写出了改写文件的程序望能交流

posted on 2005-02-15 11:28 阅读(228) 评论(0)  编辑  收藏 所属分类: Java_Xml


只有注册用户登录后才能发表评论。


网站导航: