读写XML数据

读写XML数据

       在Java语言崛起的同时,计算机软件开发也发生了重大变化,这就是可扩展标记语言(XML)的面世。XML是一种用于组织和存储数据以便程序读取的格式。通过XML,数据的读写完全可以独立于创建它的软件。

       XML数据可以使用分析器(parser)来读取,分析器是一种能够识别XML格式并提取所需数据的程序。下面我们将使用XML对象模型(XML Object Model , XOM)来读写XML数据,XOM是一个Java类库,在Java程序中使用XOM可以方便地处理XML数据。

1、创建XML文件

       XML数据无处不在,可存储在文件中,可通过Internet网络传输,可以存储在内存中。Java类库中有多个可读写XML的类,其中包括jva.util包中的Properties类。Properties对象可存储为XML格式,当使用配置属性填充这种对象后,可以使用其storeToXML()方法将其保存到XML文件中,该方法接受两个参数:

              >一个FileOutputStream对象:通过它将数据存储到文件中;

              >一条注释:如果数据不需要注释,可以为空字符串。

       下面是一个简单的应用程序,它将配置属性存储为XML格式:

public classJavaApplication1
{
    public JavaApplication1() {
        Properties properties = newProperties();
       properties.setProperty("username", "小武灵灵");
       properties.setProperty("userage", "22");
       properties.setProperty("userqq", "413672141");
        try {
            File file = new File("D:\\桌面\\桌面\\安卓开发工具\\学习笔记\\prop.xml");
            FileOutputStream fileOutputStream =new FileOutputStream(file);
            Date now = new Date();
            properties.store(fileOutputStream,"创建时间:" + now);
           
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
    }
   
    public static void main(String[] args)
    {
        JavaApplication1 application1 = newJavaApplication1();
        System.out.println("完毕");
    }
}

       如果这些属性被存储为其他格式(如properties.store()方法),结果是这样的:

              #\u521B\u5EFA\u65F6\u95F4:FriMar 22 20:27:47 CST 2013

              #Fri Mar 22 20:27:47 CST2013

              userqq=413672141

              userage=22

              username=\u5C0F\u6B66\u7075\u7075

       这说明第一个放进去的property会在最下面,而且usernam跟我们输入的”小武灵灵”差别很大,这是编码引起的。而运行该程序时,他将创建如下所示的XML文件:

<?xml version="1.0"encoding="UTF-8" standalone="no"?>
<!DOCTYPE propertiesSYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Create timeFri Mar 22 20:33:57 CST 2013</comment>
<entrykey="userqq">413672141</entry>
<entrykey="username">小武灵灵</entry>
<entrykey="userage">22</entry>
</properties>

       XML数据必须有一个根元素,它将所有数据括起,例如上面的<properties>。元素可以包含文本以及一个或多个子元素。XML元素还可以有一个或多个属性,它们是在元素的起始标记中以name=”value”的方式定义的。属性之间必须用空格分开,它们提供了与元素相关的补充信息。

       虽然XML被称为一种类似于HTML的格式,但它本身并非一种语言。相反XML描述如何根据要使用计算机程序完成的任务创建数据格式。XML格式被称为方言(dialect)。

2、读取XML文件

       下面说一个人,这个人是程序员兼图书作者ElliotteRusty Harold,这个人是Java语言和XML方面的专家,对现有的XML类库的工作原理非常失望,所以创建了自己的类库,用树表示XML数据,并将每个元素作为节点,从此便得到了广泛的使用。下载地址为http://www.cafeconleche.org/XOM/xom-1.2.9.jar安装步骤为:

       >打开项目属性,在左侧栏选择库,右侧点击添加库;

       >在弹出的对话框中点击创建,库名输入XOM,确定;

       >右侧点击添加Jar/Folder,选择存放下载的XOM类库的jar文件(我这里是C:/Java/XOM),确定;

       >选择XOM类库,点击添加,确定,OK了。

       XOM包含可用于读写XML数据并将其存储到文件或其他目的地的类。类库中的核心类位于nu.xom包中,Builder类能够加载并分析使用任何方言的XML数据,只要它是良好的格式的,下面的代码创建一个Builder对象并使用它加载一个文件:

              File file = newFile("D:\\桌面\\桌面\\安卓开发工具\\学习笔记\\prop.xml");

              nu.xom.Builder builder = new Builder();

              nu.xom.Document document = builder.build(file);

       XOM也可以加载Web上的XML数据,只需将builder.build()的参数改为网络地址:

              document =builder.build("http://blog.csdn.net/zhai56565");

       当builder对象加载XML数据时,以Document对象的方式提供它,该对象存储了整个XML文档。要检索文档的根元素,可使用Document对象的getRootElement()方法:

              Element root = document.getrootElement();

       Element类表示单个元素,可使用Element类的多个方法来查看元素的内容:

              >getFirstChildElement():提取与指定名称相同的第一个子元素;

              >get(int):读取与指定索引匹配的元素;

              >getChildeElements():提取所有的子元素;

              >getValue():读取元素的文本;

              >getAttribute():检索元素及其值。

       下面的语句检索comment元素及其值:

              Element element = document.FirstChildElement(“time”);

              String time = element.getValue();

       在多个元素的名称相同时,这种方法将不管用。对于这样的元素,可检索所有的元素并使用for循环遍历他们:

              nu.xom.Elements elements =document.getRootElement().getChildElements("entry");

                      for (int i = 0; i < elements.size();i++) {

                          Element element = elements.get(i);

               }

       该程序没有使用属性,但是可使用方法getAttribute()来访问元素的属性,该方法将属性名作为参数:

              Attribute key =element.getAttribute(“key”);

       有了属性后,就可以使用其getValue()方法来获取其对应的值:

              String keyValue =key.getValue();

       下面是一个完整的例子:

public classJavaApplication1
{
    int[] highTemp = new int[6];
    int[] lowTemp = new int[6];
    String[] conditions = new String[6];
    public JavaApplication1() throwsParsingException, ValidityException, IOException {
        Builder builder = new Builder();
        Document document =builder.build("http://tinyurl.com/rd4r72");
        Element root =document.getRootElement();
        Element simple =root.getFirstChildElement("simpleforecast");
        Elements days = simple.getChildElements();
        for (int i = 0; i < days.size();i++) {
            Element day = days.get(i);
            Element high =day.getFirstChildElement("high");
            Element highF =high.getFirstChildElement("fahrenheit");
           
            Element low =day.getFirstChildElement("low");
            Element lowF =low.getFirstChildElement("fahrenheit");
           
            Element icon =day.getFirstChildElement("icon");
           
            lowTemp[i] = -1;
            highTemp[i] = -1;
            try {
                lowTemp[i] =Integer.parseInt(lowF.getValue());
                highTemp[i] =Integer.parseInt(highF.getValue());
            } catch (Exception e) {
            }
            conditions[i] = icon.getValue();
        }
    }
 
    public void display()
    {
        for (int i = 0; i <conditions.length; i++) {
           System.out.println("Period" + i);
           System.out.println("\tConditions:" + conditions[i]);
           System.out.println("\tHigh:" + highTemp[i]);
           System.out.println("\tLow:" + lowTemp[i]);
        }
    }
   
    public static void main(String[] args)
    {
        try {
            JavaApplication1 application1 = newJavaApplication1();
            application1.display();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
       
        System.out.println("完毕");
    }
}

3、读取RSS聚合内容(Syndication Feeds)

       有数百种XML方言,以独立于平台和软件的方式表示数据。其中最流行的一种是RSS,它是一种用于共享新闻摘要和连接的格式,这些信息摘要和连接来自在线新闻网站、博客和其他信息源。

       RSS使得能够以XML格式提供Web内容,非常适合以通过网络能够访问的文件方式提供。RSS阅读器又称为新闻聚合器,已被数以百万计的信息搜集者用于跟踪最喜欢的网站。还有搜集和共享RSS内容的Web应用程序。

              String rssUrl = “http://feeds.drudge.com/retort”;

              Builder builder = newBuilder();

              Document doc =builder.build(rssUrl);

       下面是读取一个RSS文件并显示最新的15个条目:

public classJavaApplication1
{
    String[] title = new String[15];
    String[] link = new String[15];
    int count = 0;
   
    public JavaApplication1(String rssUrl) {
        try {
            Builder builder = new Builder();
            Document document =builder.build(rssUrl);
            Element root =document.getRootElement();
            Element channel =root.getFirstChildElement("channel");
            if (channel != null) {
                Elements items =channel.getChildElements("item");
                for (int i = 0; i <items.size(); i++) {
                    if (count > 15) break;
                    Element item = items.get(i);
                    Element titleElement =item.getFirstChildElement("title");
                    Element linkElement =item.getFirstChildElement("link");
                    title[i] =titleElement.getValue();
                    link[i] =linkElement.getValue();
                    count++;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    void ListItems()
    {
        for (int i = 0; i < 15; i++) {
            if (title[i] != null) {
               System.out.println("\n" + title[i]);
                System.out.println(link[i]);
                i++;
            }
        }
    }
   
    public static void main(String[] args)
    {
        JavaApplication1 application1 = newJavaApplication1("http://feeds.drudge.com/retort");
        application1.ListItems();
        System.out.println("完毕");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值