一、Libxml2介绍:
Libxml2 是一个xml的c语言版的解析器,本来是为Gnome项目开发的工具,是一个基于MIT License的免费开源软件。它除了支持c语言版以外,还支持c++、PHP、Pascal、Ruby、Tcl等语言的绑定,能在Windows、Linux、Solaris、MacOsX等平台上运行。功能还是相当强大的,相信满足一般用户需求没有任何问题。
二、 Libxml2安装:
一般如果在安装系统的时候选中了所有开发库和开发工具的话(Fedora Core系列下),应该不用安装,下面介绍一下手动安装:
1) 从xmlsoft站点或ftp(ftp.xmlsoft.org)站点下载libxml压缩包(libxml2-xxxx.tar.gz)
2) 对压缩包进行解压缩
tar xvzf libxml2-xxxx.tar.gz
3) 进入解压缩后的文件夹中运行
./configure
make
make install
安装完成后就可以使用简单的代码解析XML文件,包括本地和远程的文件,但是在编码上有一些问题。Libxml默认只支持UTF-8的编码,无论输入输出都是UTF-8,所以如果你解析完一个XML得到的结果都是UTF-8的,如果需要输出GB2312或 ......
今日继续学习Android中使用Pull的XML解析技术实现对XML文件的解析和创建。由于明天休息,时间比较充裕,所以我也将昨天未总结的SAX解析技术在此做个总结。
一、SAX解析技术
Sax使用的是事件驱动的流式解析技术。事件驱动的流式解析方式是,从文件的开始顺序解析到文档的结束,不可暂停或倒退。当解析到文档的开始或结束、元素的开始或结束等都会触发一个事件,我们在事件处理方法中完成对数据的操作。由此可见,我们需要编写实现了事件接口的类。
1.创建Android工程(eclipse3.5):
Project name:AndroidXML
BuildTarget:Android2.1
Application name:Android XML 解析技术
Package name:com.changcheng.androidxml
Create Activity:AndroidXML
Min SDK Version:7
2.需要解析的XML文件:
"1.0" encoding="UTF-8"?>
"23">
C++ Primer 4
78
"20">
Think in Java
76
该文件存放于src源码目录。
3.XML文件对应的实体Book:
package com.changcheng.androidxml.entity;
public class Book {
private int id;
private String name;
private float price;
public Book() {
}
public Book(int id, String name, float price) {
this.id = id;
t ......
declare @x xml
set @x='
<ROOT>
<SM>
<SMID>88</SMID>
<SMCD>A5</SMCD>
<SMNM>刘洋</SMNM>
<NDS>
<ND>
<SF>3</SF>
<NDID>88</NDID>
<NDCD>A5</NDCD>
<NDNM>林林</NDNM>
<CDST>
<tR1>1</tR1>
<tR2>2</tR2>
<tR3>3</tR3>
<tR4>4</tR4>
<tR5>5</tR5>
<tR6>6</tR6>
<tR7>7</tR7>
<tR8>8</tR8>
<tR9>9</tR9>
<tt2>1</tt2>
<tt130>2</tt130>
<t132>3</t132>
<t155>4</t155>
</CDST>
</ND>
</NDS>
</SM>
<SM>
<SMID>84</SMID>
<SMCD>A6</SMCD>
<SMNM> ......
解决了,是1楼说的方法,不能写成
context.Response.ContentType = "xml";
必须要是
context.Response.ContentType = "text/xml";
就OK了~
实例:
Response.ContentType = "text/xml";
Page.Response.Write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
Page.Response.Write("<data>");
Page.Response.Write("<pets>");
Page.Response.Write("<pet>猫</pet>");
Page.Response.Write("<pet>狗</pet>");
Page.Response.Write("<pet>鱼</pet>");
Page.Response.Write("</pets>");
&n ......
/////////////////////////////////////////////////
// 主题:一段用来判断日期是星期几的代码
// 描述:摘自《CCFAQ》
// 作者:天之枫
// 时间:2010-02-13
/////////////////////////////////////////////////
#include <stdio.h>
int dayofweek(int y, int m, int d) // 判断输入的日期是星期几
{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
} /* 0 = Sunday */
int main(void)
{
printf( "今天是星期%d \n", dayofweek(2010,2,13) );
return 0;
}
......
[C/C++ Digestion] –
重载操作符
作者:
Jason Lee @
http://blog.csdn.net/jasonblog
日期:
2010-04-17
[1]
重载操作符
重载操作符从大的方面来讲可以分为两类:最好或必须作为类的成员函数的,以及相反。而具体地讲,最好或必须作为类的成员函数的有赋值操作符
( = )
、下标操作符
( [] )
、调用操作符
( () )
、成员访问箭头操作符
( ->
,目前列出的操作符都必须为成员函数
)
、星号解引用操作符
( * )
、复合赋值操作符
( +=
等
)
、自增、自减。其它的一些操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为非成员函数,在这种情况下,通常需要将其定义为类的友元函数。当然,还有一些是不建议重载的操作符,如逗号、取地址运算符和逻辑运算符等。
[2]
赋值操作符
赋值操作符必须是类的成员函数,因为编译器需要知道类是否有赋值操作符这个信息。并且,赋值操作符必须返回对
*this
的引用,也就是左操作数
(
对象自身
)
的引用。
同样的,复合赋值操作符也应返回对
*this
的引用。
如下是一段示例代码:
#include <iostream>
using namespace std;
class Demo { ......
[C/C++ Digestion] –
重载操作符
作者:
Jason Lee @
http://blog.csdn.net/jasonblog
日期:
2010-04-17
[1]
重载操作符
重载操作符从大的方面来讲可以分为两类:最好或必须作为类的成员函数的,以及相反。而具体地讲,最好或必须作为类的成员函数的有赋值操作符
( = )
、下标操作符
( [] )
、调用操作符
( () )
、成员访问箭头操作符
( ->
,目前列出的操作符都必须为成员函数
)
、星号解引用操作符
( * )
、复合赋值操作符
( +=
等
)
、自增、自减。其它的一些操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为非成员函数,在这种情况下,通常需要将其定义为类的友元函数。当然,还有一些是不建议重载的操作符,如逗号、取地址运算符和逻辑运算符等。
[2]
赋值操作符
赋值操作符必须是类的成员函数,因为编译器需要知道类是否有赋值操作符这个信息。并且,赋值操作符必须返回对
*this
的引用,也就是左操作数
(
对象自身
)
的引用。
同样的,复合赋值操作符也应返回对
*this
的引用。
如下是一段示例代码:
#include <iostream>
using namespace std;
class Demo { ......