新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> XML网站展示,XML源代码,XML编程示例。 本版仅接受原创、转贴、网站展示,具体的技术交流请前往各相关版块。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XML源码及示例(仅原创和转载) 』 → 简析JAVA的XML编程 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 10859 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 简析JAVA的XML编程 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     咖啡心情 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:6
      积分:146
      门派:XML.ORG.CN
      注册:2005/12/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给咖啡心情发送一个短消息 把咖啡心情加入好友 查看咖啡心情的个人资料 搜索咖啡心情在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看咖啡心情的博客楼主
    发贴心情 简析JAVA的XML编程

    XML作为全球通用的结构化语言,越来越受人们青睐,各种开发平台(比如Microsoft Studio系列、Oracle系列、Inprise Borland系列等)也都把支持XML开发作为宣传口号之一 。由于笔者所从事的电子政务开发较早的引入了XML,所以尝到了许多甜头,在许多项目中利用XML数据交换信息,省去了许多麻烦事,不用制定繁锁的数据格式,利用XML数据易于表达,也利于一线开发者跟踪调试。
    笔者先前也曾发表过相关的文章,比如《简析Delphi中的XML编程》一文,有兴趣的读者可以到Google网(http://www.google.com)去搜索一下,有很多媒体转载。今天笔者想探讨的是关于JAVA中的XML编程,希望对正在或想要学习XML编程的新老读者有所帮助。

    在XML应用中,最常用也最实用的莫过于XML文件的读写,所以笔者通过一个简单的XML文件读写来作简要分析。可以在任何文本编辑器中先建立如下结构的XML文件,类似于HTML结构,但XML语义比较严格,起始标记必须配对,比如"〈学生花名册〉"与"〈/学生花名册〉"对应,空格多少可不必在意,但一般都以缩格形式书写,便于阅读。把此文件命名为Input.xml,可以在任何支持XML的浏览器中打开测试一下,如果输入正确,在浏览中可以看到此文件的树形表示结构。如果您还对XML结构感到比较陌生,建议先看看《简析Delphi中的XML编程》一文中关于XML文件的说明。
    <?xml version="1.0" encoding="GB2312"?>
    <学生花名册>
    <学生 性别 = "男">
    <姓名>李华</姓名>
    <年龄>14</年龄>
    <电话>6287555</电话>
    </学生>
    <学生 性别 = "男">
    <姓名>张三</姓名>
    <年龄>16</年龄>
    <电话>8273425</电话>
    </学生>
    </学生花名册>

    准备工作做完后,接着就开始写实质性的JAVA代码了。为保存从XML文件读入的信息,需要先建一个简单的Bean来保存学生信息,命名为StudentBean,代码如下所示:
    public class StudentBean {
    private String sex; //学生性别
    private String name; //学生姓名
    private int age; //学生年龄
    private String phone; //电话号码

    public void setSex(String s) {
    sex = s;
    }
    public void setName(String s) {
    name = s;
    }
    public void setAge(int a) {
    age = a;
    }
    public void setPhone(String s) {
    phone = s;
    }
    public String getSex() {
    return sex;
    }
    public String getName() {
    return name;
    }
    public int getAge() {
    return age;
    }
    public String getPhone() {
    return phone;
    }
    }

    之后写XML的测试类,笔者把这个类命名为XMLTest,为了读写XML文件,需要导入如下JAVA包,"//"后为注释说明,笔者的环境是JDK 1.3.1_04,在JDK 1.4.0中测试也通过,XML解释器用Apache的Crimson,可以到Apache主页去上载。
    import java.io.*; //Java基础包,包含各种IO操作
    import java.util.*; //Java基础包,包含各种标准数据结构操作
    import javax.xml.parsers.*; //XML解析器接口
    import org.w3c.dom.*; //XML的DOM实现
    import org.apache.crimson.tree.XmlDocument;//写XML文件要用到

    为了保存多个学生信息,还得借助一个集合类(并不是单纯意义上的集合,JAVA中的集合是集合框架的概念,包含向量、列表、哈希表等),这里采用Vector向量类。定义在XMLTest测试类中,命名为student_Vector。然后定义两个方法readXMLFile和writeXMLFile,实现读写操作。代码如下:
    private void readXMLFile(String inFile) throws Exception {
    //为解析XML作准备,创建DocumentBuilderFactory实例,指定DocumentBuilder
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = null;
    try {
    db = dbf.newDocumentBuilder();
    } catch (ParserConfigurationException pce) {
    System.err.println(pce); //出异常时输出异常信息,然后退出,下同
    System.exit(1);
    }

    Document doc = null;
    try {
    doc = db.parse(inFile);
    } catch (DOMException dom) {
    System.err.println(dom.getMessage());
    System.exit(1);
    } catch (IOException ioe) {
    System.err.println(ioe);
    System.exit(1);
    }
    //下面是解析XML的全过程,比较简单,先取根元素"学生花名册"
    Element root = doc.getDocumentElement();
    //取"学生"元素列表
    NodeList students = root.getElementsByTagName("学生");
    for (int i = 0; i < students.getLength(); i++) {
    //依次取每个"学生"元素
    Element student = (Element) students.item(i);
    //创建一个学生的Bean实例
    StudentBean studentBean = new StudentBean();
    //取学生的性别属性
    studentBean.setSex(student.getAttribute("性别"));
    //取"姓名"元素,下面类同
    NodeList names = student.getElementsByTagName("姓名");
    if (names.getLength() == 1) {
    Element e = (Element) names.item(0);
    Text t = (Text) e.getFirstChild();
    studentBean.setName(t.getNodeValue());
    }

    NodeList ages = student.getElementsByTagName("年龄");
    if (ages.getLength() == 1) {
    Element e = (Element) ages.item(0);
    Text t = (Text) e.getFirstChild();
    studentBean.setAge(Integer.parseInt(t.getNodeValue()));
    }

    NodeList phones = student.getElementsByTagName("电话");
    if (phones.getLength() == 1) {
    Element e = (Element) phones.item(0);
    Text t = (Text) e.getFirstChild();
    studentBean.setPhone(t.getNodeValue());
    }

    student_Vector.add(studentBean);
    }
    }

    private void writeXMLFile(String outFile) throws Exception {
    //为解析XML作准备,创建DocumentBuilderFactory实例,指定DocumentBuilder
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = null;
    try {
    db = dbf.newDocumentBuilder();
    } catch (ParserConfigurationException pce) {
    System.err.println(pce);
    System.exit(1);
    }

    Document doc = null;
    doc = db.newDocument();

    //下面是建立XML文档内容的过程,先建立根元素"学生花名册"
    Element root = doc.createElement("学生花名册");
    //根元素添加上文档
    doc.appendChild(root);

    //取学生信息的Bean列表
    for (int i = 0; i < student_Vector.size(); i++) {
    //依次取每个学生的信息
    StudentBean studentBean = (StudentBean) student_Vector.get(i);
    //建立"学生"元素,添加到根元素
    Element student = doc.createElement("学生");
    student.setAttribute("性别", studentBean.getSex());
    root.appendChild(student);
    //建立"姓名"元素,添加到学生下面,下同
    Element name = doc.createElement("姓名");
    student.appendChild(name);
    Text tName = doc.createTextNode(studentBean.getName());
    name.appendChild(tName);

    Element age = doc.createElement("年龄");
    student.appendChild(age);
    Text tAge = doc.createTextNode(String.valueOf(studentBean.getAge()));
    age.appendChild(tAge);

    Element phone = doc.createElement("电话");
    student.appendChild(phone);
    Text tPhone = doc.createTextNode(studentBean.getPhone());
    phone.appendChild(tPhone);
    }
    //把XML文档输出到指定的文件
    FileOutputStream outStream = new FileOutputStream(outFile);
    OutputStreamWriter outWriter = new OutputStreamWriter(outStream);
    ((XmlDocument) doc).write(outWriter, "GB2312");
    outWriter.close();
    outStream.close();
    }

    最后加入测试主函数,如下:
    public static void main(String[] args) throws Exception {
    //建立测试实例
    XMLTest xmlTest = new XMLTest();
    //初始化向量列表
    xmlTest.student_Vector = new Vector();

    System.out.println("开始读Input.xml文件");
    xmlTest.readXMLFile("Input.xml");

    System.out.println("读入完毕,开始写Output.xml文件");
    xmlTest.writeXMLFile("Output.xml");
    System.out.println("写入完成");
    }

    好了,保存好StudentBean和XMLTest,把Input.xml保存到工作目录下。如果您输入很仔细,没敲错字母的话,可以看到"写入完成"了,去瞧瞧Output.xml文件和Input.xml文件是不是一样吧。


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/9 8:57:00
     
     lazyy 美女呀,离线,快来找我吧!
      
      
      等级:大二期末(数据结构考了98分!)
      文章:61
      积分:330
      门派:XML.ORG.CN
      注册:2005/5/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给lazyy发送一个短消息 把lazyy加入好友 查看lazyy的个人资料 搜索lazyy在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看lazyy的博客2
    发贴心情 
    太感谢楼主了.谢谢了啊!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/10 10:48:00
     
     roam_cat 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:55
      门派:XML.ORG.CN
      注册:2005/12/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给roam_cat发送一个短消息 把roam_cat加入好友 查看roam_cat的个人资料 搜索roam_cat在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看roam_cat的博客3
    发贴心情 
    好东西,谢谢LZ
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/15 15:11:00
     
     AdrianMustuf 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:10
      积分:96
      门派:XML.ORG.CN
      注册:2005/12/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给AdrianMustuf发送一个短消息 把AdrianMustuf加入好友 查看AdrianMustuf的个人资料 搜索AdrianMustuf在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看AdrianMustuf的博客4
    发贴心情 
    Great,Tks.
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/15 17:45:00
     
     AdrianMustuf 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:10
      积分:96
      门派:XML.ORG.CN
      注册:2005/12/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给AdrianMustuf发送一个短消息 把AdrianMustuf加入好友 查看AdrianMustuf的个人资料 搜索AdrianMustuf在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看AdrianMustuf的博客5
    发贴心情 
    仔细看了一下,发觉这种方法已经不使用了,新的方法是采用xalan和xerces
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/16 11:16:00
     
     kairwen 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2005/12/23

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给kairwen发送一个短消息 把kairwen加入好友 查看kairwen的个人资料 搜索kairwen在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看kairwen的博客6
    发贴心情 
    ((XmlDocument) doc).write(outWriter, "GB2312");
    //这一句出现java.lang.ClassCastException 错误,怎样处理?
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/23 11:51:00
     
     鹏凌三千 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2006/2/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给鹏凌三千发送一个短消息 把鹏凌三千加入好友 查看鹏凌三千的个人资料 搜索鹏凌三千在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看鹏凌三千的博客7
    发贴心情 
    垃圾...
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/2/17 15:15:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML源码及示例(仅原创和转载) 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/1/5 5:13:39

    本主题贴数7,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    140.625ms