读写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("完毕");
}
}