欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java基础第十九篇之Xml

程序员文章站 2023-11-12 09:13:58
1:xml的概述 1.1 xml是什么 标记语言:语言中出现了的标签 a:HTML 超文本标记语言 (语法非常严格,不能随意的定义标签) b:XML 可扩展的标记语言(用户可以根据自己的需求,随意的定义标签) 开发的组织:w3c 版本:使用 1.0 1.2 xml有什么用 a:存储数据 ......

1:xml的概述
1.1 xml是什么
标记语言:语言中出现了<a></a>的标签
a:html 超文本标记语言 (语法非常严格,不能随意的定义标签)
b:xml 可扩展的标记语言(用户可以根据自己的需求,随意的定义标签)
开发的组织:w3c
版本:使用 1.0

1.2 xml有什么用
a:存储数据
b:作为配置文件
1.3 xml怎么用


<?xml version="1.0" encoding="utf-8"?>
<persons>
<person id="p001">
<name>张三</name>
</person>
<person id="p002">
<name>李四</name>
</person>
</persons>

//-------------------------------
<students>
<student id="i001">
<name>zhangsan</name>
</student>

<student id="i002">
<name>lisi</name>
</student>

</students>

2:xml的语法
2.1 文档声明
<?xml version="1.0" encoding="utf-8"?>
1) 文档声明必须为<?xml开头,以?>结束;
2) 文档声明必须从文档的0行0列位置开始;
3) 文档声明只有2个属性:
a) versioin:指定xml文档版本。只会选择1.0;
b) encoding:指定当前文档保存时编码方式。可选属性,默认值是utf-8;

例题:
<?xml version="1.0" encoding="utf-8"?>
<!doctype beans system "bean.dtd" >
<beans>

</beans>


2.2 元素(element)
1. 元素是xml文档中最重要的组成部分, 开始标签 元素体 结束标签
2. 普通元素的结构开始标签、元素体、结束标签组成。例如:<hello> 大家好 </hello>
3. 元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a></b>
4. 空元素:元素没有元素体,空元素只有开始标签,而没有结束标签,但元素必须自己闭合,例如:<c/>
5. 元素命名:
a) 区分大小写
b) 不能使用空格,不能使用冒号:
c) 不建议以xml、xml、xml开头
6. 格式化良好的xml文档,必须只有一个根元素。除了根元素,所有元素必须被其他元素包含


2.3 属性(attribute)
1. 属性是元素的一部分,它必须出现在元素的开始标签中
2. 属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
3. 一个元素可以有0~n个属性,但一个元素中不能出现同名属性
4. 属性名不能使用空格、冒号等特殊字符,且必须以字母开头

属性和子元素的选择
a:如果你描述的数据是对元素的标识(id),则应该放在属性中
b:如果你描述的数据需要进行再次扩展,必须放在子元素中
2.4 注释
xml的注释,以“<!--”开始,以“-->”结束。注释内容会被xml解析器忽略!
a)注释不能放在文件的第一行
b)注释的快捷键
注释 :ctrl + shift + /
反注释 :ctrl + shift + \

<?xml version="1.0" encoding="utf-8"?>

<!-- 这个是注释 -->
<阿拉基>
<student stuid="it001">
<name>zhangsan</name>
<age>18</age>
</student>
<student stuid="it002">
<name>lisi</name>
<age>20</age>
</student>
</阿拉基>

2.4 转义字符
 转义字符
因为很多符号已经被xml文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例如:“<”、“>”、“’”、“””、“&”。
< --> &lt;
> --> &gt;
" --> &quot;
' --> &apos;
& --> &amp
2.5 cdata区
<![cdata[
任意内容
]]>
当你的标签内容有大量的转义字符时,则可以使用cdata区,一次性全部转义

例题:
<?xml version="1.0" encoding="utf-8"?>

<hello>a &lt; b c &gt; d
<![cdata[
<student stuid="it002">
<name>lisi</name>
<age>20</age>
</student>
]]>
</hello>


3:xml的约束
xml约束:xml中的标签默认是可以随便扩展,这样就造成了xml的随意性太大,为了给xml一个统一 的规范,就必须使用xml约束

3.1 dtd约束
dtd(document type definition),文档类型定义
约束:标签的名字,标签的属性,标签的顺序
我们的任务就是根据已经提供好的dtd约束文档来定义xml文件

3.2 dtd约束步骤
 步骤1:创建bean-dtd.xml文档,并将“bean.dtd”拷贝相同目录下
步骤2:从dtd文档开始处,拷贝需要的“文档声明”
步骤3:完成xml内容编写

3.4 dtd的文档声明
1: 内部dtd,在xml文档内部嵌入dtd,只对当前xml有效。
<?xml version="1.0" encoding="utf-8" ?>
<!doctype beans [
... //具体的语法
]>
<beans>
</beans>

2: 本地dtd,dtd文档在本地系统上,公司内部自己项目使用。
<?xml version="1.0" encoding="utf-8" ?>
<!doctype beans system"bean.dtd">
<beans>
</beans>

3: 外部dtd—公共dtd,dtd文档在网络上,一般都有框架提供。
需要有网络,当第一次使用之后,则会在本地缓存。
<?xml version="1.0" encoding="utf-8"?>
<!-- dtd的名字-->
<!doctype beans public "-//spring//dtd bean 2.0//en"
<!-- dtd的网络位置-->
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>

3.5 元素
<!element 元素名 元素描述>
?:可以出现,但只能出现一次
*:允许出现多次,也可以是0次
+:该对象至少出现一次,但可以是多次
,:元素按照指定的顺序出现

//------------------------------------------
根元素:beans 而且有两个子元素:bean(0次或多次) 和import(0次或多次,而且必须按照指定的顺序出现
#pcdata:表示元素体是文本

<!element beans (bean*,import*) >
<!element bean (property*)>
<!element property (#pcdata)>

<!element import (#pcdata)>

bean有三个属性:id classname type
<!attlist bean id id #required
classname cdata #required
type cdata #implied
>

<!attlist property name cdata #required
value cdata #required
>

<!attlist import resource cdata #required>

 

 

 

 


3.2 schema约束
schema是新的xml文档约束;
schema要比dtd强大很多,是dtd 替代者;
schema本身也是xml文档,但schema文档的扩展名为xsd,而不是xml。
schema 功能更强大,数据类型更完善
schema 支持名称空间
3.3 约束文档和xml关系
w3c提出schema约束规范时,就提供“官方约束文档”。我们通过官方文档,必须“自定义schema 约束文档”,开发中“自定义文档”由框架编写者提供。我们提供“自定义文档”限定,编写出自己的xml文档。
3.3 命名空间
默认的命名空间
xmlns="http://www.baidu.cn/bean"
显式的命名空间
xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
使用标签时,必须加前缀
xsi:xxx

必须指定xsd文件的位置

//命名空间 约束文件的名字
xsi:schemalocation="http://www.baidu.cn/bean bean-schema.xsd">

案例:

<?xml version="1.0" encoding="utf-8"?>
<!--
ns:namespac:命名空间 类似于java中包

当我们去使用一个约束文件(w3c的约束除外)时,除了必须对该约束声明之外,
还必须指定该约束文件的名字

xsi:schemalocation="http://www.baidu.cn/bean bean-schema.xsd"

-->
<beans xmlns="http://www.baidu.cn/bean"
xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xsi:schemalocation="http://www.baidu.cn/bean bean-schema.xsd">
<bean classname="" id="">
<property value=""/>
<ele/>
</bean>
<import resource=""/>
</beans>

例题:
<?xml version="1.0" encoding="utf-8"?>

<student xmlns="http://www.baidu.cn/bean"
xmlns:bz="http://www.bz.cn/bz"
xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance"
xsi:xsi:schemalocation="http://www.baidu.cn/bean bean-schema.xsd
http://www.bz.cn/bz bz.xsd
"
></student>


"xmlns"是xhtml namespace的缩写,叫做"名字空间"声明。名字空间是什么作用呢?我的理解是:

由于xml允许你自己定义自己的标识,你定义的标识和其他人定义的标识有可能相同,但表示不同的意义。当文件交换或者共享的时候就容易产生错误。为了避免这种错误发生,xml采用名字空间声明,允许你通过一个网址指向来识别你的标识。

比如在一个文档<table>wood table</table>中<table>表示桌子,而在另一个文档<table>namelist</table>中<table>表示表格。如果我需要同时处理这两个文档,就会发生名字冲突。为了解决这个问题,我们引进了namespaces这个概念。namespaces通过给标识名称加一个网址(url)定位的方法来区别这些名称相同的标识。
namespaces同样需要在xml文档的开头部分声明,声明的语法如下:
<document xmlns:yourname='url'>

其中yourname是由你定义的namespaces的名称,url就是名字空间的网址。
假设上面的"桌子<table>"文档来自http://www.zhuozi.com/,我们就可以声明为
<document xmlns:zhuozi='http://www.zhuozi.com'>;

然后在后面的标识中使用定义好的名字空间:
<zhuozi:table>wood table</table>
这样就将这两个<table>区分开来。注意的是:设置url并不是说这个标识真的要到那个网址去读取,仅仅作为一种区别的标志而已。

命名冲突请看下面两个例子
这个 xml 文档在table元素中携带了水果的信息:
<table>
<tr>
<td>apples</td>
<td>bananas</td>
</tr>
</table>

这个 xml 文档在table元素中携带了桌子的信息(家具,不能吃的哦):
<table>
<name>african coffee table</name>
<width>80</width>
<length>120</length>
</table>
如果上面两个xml文档片断碰巧在一起使用的话,那么将会出现命名冲突的情况。因为这两个片断都包含了<table>元素,而这两个table元素的定义与所包含的内容又各不相同。

--------------------------------------------------------------------------------
使用前缀解决命名冲突问题
下面的xml文档在table元素中携带了信息:
<h:table>
<h:tr>
<h:td>apples</h:td>
<h:td>bananas</h:td>
</h:tr>
</h:table>

下面的xml文档携带了家具table的信息:
<f:table>
<f:name>african coffee table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>

现在已经没有元素命名冲突的问题了,因为这两个文档对各自的table元素使用了不同的前缀,table元素在两个文档中分别是(<h:table> 和<f:table>)。
通过使用前缀,我们创建了两个不同的table元素。

--------------------------------------------------------------------------------
使用命名空间
下面的xml文档在table元素中携带了信息:
<h:table xmlns:h="http://www.w3.org/tr/html4/">
<h:tr>
<h:td>apples</h:td>
<h:td>bananas</h:td>
</h:tr>
</h:table>

下面的xml文档携带了家具table的信息:
<f:table xmlns:f="http://www.w3schools.com/furniture">
<f:name>african coffee table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
在上面两个例子中除了使用前缀外,两个table元素都使用了xmlns属性,使元素和不同的命名空间关联到一起。

--------------------------------------------------------------------------------
命名空间属性
命名空间属性一般放置在元素的开始标记处,其使用语法如下所示:
xmlns:namespace-prefix="namespace"

在上面的例子中,命名空间定义了一个internet 地址:
xmlns:f="http://www.w3schools.com/furniture"

w3c 命名规范声明命名空间本身就是一个统一资源标示符,uniform resource identifier (uri)。

当我们在元素的开始标记处使用命名空间时,该元素所有的子元素都将通过一个前缀与同一个命名空间相互关联。
注意:用来标识命名空间的网络地址并不被xml解析器调用,xml解析器不需要从这个网络地址中查找信息,该网络地址的作用仅仅是给命名空间一个唯一的名字,因此这个网络地址也可以是虚拟的,然而又很多公司经常把这个网络地址指向一个真实的web页面,这个地址包含了关于当前命名空间更详细的信息。
可以访问http://www.w3.org/tr/html4/.

--------------------------------------------------------------------------------
统一资源标识符
通用资源标识符(a uniform resource identifier (uri))是一个标识网络资源的字符串。最普通的uri应该是统一资源定位符uniform resource locator (url)。url用于标识网络主机的地址。另一方面,另一个不常用的uri是通用资源名字universal resource name (urn)。在我们的例子中,一般使用的是urls。
既然前面的例子使用的url地址来标识命名空间,我们可以确信这个命名空间是唯一的。

--------------------------------------------------------------------------------
默认的命名空间
定义一个默认的xml命名空间使得我们在子元素的开始标记中不需要使用前缀。他的语法如下所示:
<element xmlns="namespace">
下面的xml文档在table元素中包含了水果的信息:
<table xmlns="http://www.w3.org/tr/html4/">
<tr>
<td>apples</td>
<td>bananas</td>
</tr>
</table>
下面的xml文档包含了家具table的信息:
<table xmlns="http://www.w3schools.com/furniture">
<name>african coffee table</name>
<width>80</width>
<length>120</length>
</table>

--------------------------------------------------------------------------------
使用命名空间
档开始使用xsl的时候,就会发现命名空间使用的是如此频繁。xsl样式单主要用于将xml文档转换成类似于html文件的格式。
如果看一下下面的xsl文档,就会发现有很多标记都是html标记。那些标记并不是html标记,是加了前缀的xsl,这个xsl前缀由命名空间"http://www.w3.org/tr/xsl"所标识:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/tr/xsl">
<xsl:template match="/">
<html>
<body>
<table border="2" bgcolor="yellow">
<tr>
<th>title</th>
<th>artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>


4:xml解析
就是取出xml存储的数据(属性和文本)
<!-- xml文件-->

常用api如下:
1. saxreader对象
a) read(…) 加载执行xml文档
2. document对象
a) getrootelement() 获得根元素
3. element对象
a) elements(…) 获得指定名称的所有子元素。可以不指定名称
b) element(…) 获得指定名称第一个子元素。可以不指定名称
c) getname() 获得当前元素的元素名
d) attributevalue(…) 获得指定属性名的属性值
e) elementtext(…) 获得指定名称子元素的文本值
f) gettext() 获得当前元素的文本内容
h) attributes() 表示获得这个元素所有的属性名,返回一个集合来存储它们
代码如下:获得属性名的集合后(集合的类型为attribute) ,这样就得到了一个元素里
面的每一个属性名对象(而类型是attribute),再调用geiname(),得到每一个属性名的名字

例子:

public class test1 {
public static void main(string[] args) throws exception {
saxreader sr = new saxreader();
document read = sr.read("did.xml");
element rootelement = read.getrootelement();
list<element> elements = rootelement.elements();;
student s = new student();
for (element element : elements) {
list<attribute> attributes = element.attributes();
for (attribute attribute : attributes) {
string name = attribute.getname();
system.out.println(name);
}
list<element> elements1 = element.elements();
for (element element1 : elements1) {
string text = element1.gettext();
string name = element1.getname();
beanutils.setproperty(s,name,text);
system.out.println(name);
system.out.println(text);
}
}
system.out.println(s);
}

}

例题:书架

<?xml version="1.0" encoding="utf-8" ?>
<书架>
<书 isbn = "it12306">
<书名>java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>39.00元</售价>
</书>
<书 isbn = "it10086">
<书名>javascript网页开发</书名>
<作者>张孝祥</作者>
<售价>199.00元</售价>
</书>
</书架>

import java.util.list;

import org.dom4j.document;
import org.dom4j.documentexception;
import org.dom4j.element;
import org.dom4j.io.saxreader;

public class xmlparse {
public static void main(string[] args) throws documentexception {
//1: 创建saxreader对象
saxreader sr = new saxreader();
//2:将整个xml读取到内存
document document = sr.read("books.xml");
//3: 获取根元素
element rootelement = document.getrootelement();
//4:获取根元素的子元素: 书
list<element> elements = rootelement.elements();
//5:遍历集合,获取书架的子元素
for (element element : elements) {
//5.1获取书的属性值isbn
string value = element.attributevalue("isbn");
system.out.println(value);
//6:获取书的子元素:书名 作者 售价
list<element> elements2 = element.elements();
for (element element2 : elements2) {
//获取书名 作者 售价的文本值
string text = element2.gettext();
system.out.println(element2.getname()+":"+text);
}
}
}
}


例题:给自定义的类加上自定义的注解,进行排序

package pack02_homework;

import java.lang.annotation.elementtype;
import java.lang.annotation.retention;
import java.lang.annotation.retentionpolicy;
import java.lang.annotation.target;

@retention(retentionpolicy.runtime)
@target(elementtype.method)
public @interface myannotation {
public abstract string myrun();
public abstract string myorder();
}


package pack02_homework;

import java.lang.reflect.invocationtargetexception;
import java.lang.reflect.method;
import java.util.arraylist;
import java.util.collections;
import java.util.comparator;

class demo{
private int index;
private method method;
public demo() {
super();
// todo auto-generated constructor stub
}
public demo(int index, method method) {
super();
this.index = index;
this.method = method;
}
public int getindex() {
return index;
}
public void setindex(int index) {
this.index = index;
}
public method getmethod() {
return method;
}
public void setmethod(method method) {
this.method = method;
}


}
public class testdemo {
public static void main(string[] args) throws illegalaccessexception, illegalargumentexception, invocationtargetexception, instantiationexception {
class<?> clazz = useannotation.class;
object obj = clazz.newinstance();
arraylist<demo> list = new arraylist<demo>();
method[] methods = clazz.getmethods();

for (method method : methods) {
boolean bl = method.isannotationpresent(myannotation.class);
if(bl){
myannotation annotation = method.getannotation(myannotation.class);
string run = annotation.myrun();
if(run.equals("run")){
string order = annotation.myorder();
if(order.equals("first")){
list.add(new demo(1,method));
}
if(order.equals("second")){
list.add(new demo(2,method));
}
if(order.equals("third")){
list.add(new demo(3,method));
}
if(order.equals("forth")){
list.add(new demo(4,method));
}
}
}

}
//对集合进行排序
collections.sort(list, new comparator<demo>() {

@override
public int compare(demo o1, demo o2) {
return o1.getindex() - o2.getindex();
}
});
for(demo d : list){
method method = d.getmethod();
method.invoke(obj);
}
}
}


//加强版

package pack03_homework;

import java.lang.reflect.invocationtargetexception;
import java.lang.reflect.method;
import java.util.collections;
import java.util.comparator;
import java.util.map.entry;
import java.util.set;
import java.util.treemap;

class demo{
private int index;
private method method;
public demo() {
super();
// todo auto-generated constructor stub
}
public demo(int index, method method) {
super();
this.index = index;
this.method = method;
}
public int getindex() {
return index;
}
public void setindex(int index) {
this.index = index;
}
public method getmethod() {
return method;
}
public void setmethod(method method) {
this.method = method;
}


}
public class testdemo {
public static void main(string[] args) throws illegalaccessexception, illegalargumentexception, invocationtargetexception, instantiationexception {
class<?> clazz = useannotation.class;
object obj = clazz.newinstance();
treemap<integer, method> tm = new treemap<>();
method[] methods = clazz.getmethods();

for (method method : methods) {
boolean bl = method.isannotationpresent(myannotation.class);
if(bl){
myannotation annotation = method.getannotation(myannotation.class);
string run = annotation.myrun();
if(run.equals("run")){
string order = annotation.myorder();
if(order.equals("first")){
tm.put(1, method);
}
if(order.equals("second")){
tm.put(2, method);
}
if(order.equals("third")){
tm.put(3, method);
}
if(order.equals("forth")){
tm.put(4, method);
}
}
}

}

set<entry<integer,method>> entryset = tm.entryset();
for (entry<integer, method> entry : entryset) {
method method = entry.getvalue();
method.invoke(obj);
}
}
}


例题:在集合中存储自定义类型,并排序

package pack01_kuozhan;

import java.util.comparator;

public class student {
private string name;
private int age;
public student() {
super();
// todo auto-generated constructor stub
}
public student(string name, int age) {
super();
this.name = name;
this.age = age;
}
public string getname() {
return name;
}
public void setname(string name) {
this.name = name;
}
public int getage() {
return age;
}
public void setage(int age) {
this.age = age;
}
@override
public string tostring() {
return "student [name=" + name + ", age=" + age + "]";
}



}

package pack01_kuozhan;

import java.util.comparator;
import java.util.map.entry;
import java.util.set;
import java.util.treemap;
import java.util.treeset;

public class demo05treemap {
public static void main(string[] args) {
treemap<student,string> tm = new treemap<student,string>(new comparator<student>() {

@override
public int compare(student o1, student o2) {
return o1.getage() - o2.getage();
}
});

tm.put(new student("liutao",32), "上海");
tm.put(new student("liuyan",35), "上海");
tm.put(new student("abao",33), "上海");
tm.put(new student("shishi",50), "上海");

set<entry<student, string>> entryset = tm.entryset();
for (entry<student, string> entry : entryset) {
student key = entry.getkey();
system.out.println(key);
}
}
}

package com.baidu_01;

import java.util.arraylist;
import java.util.collections;
import java.util.comparator;

public class test7 {
public static void main(string[] args) {
arraylist<student> list = new arraylist<student>();

list.add(new student("赵四12",24));
list.add(new student("王五3",21));
list.add(new student("李三456",35));
list.add(new student("张二",11));

/*collections.sort(list, new comparator<student>() {

@override
public int compare(student o1, student o2) {
// todo auto-generated method stub
return o1.getage() - o2.getage();
}
});*/


collections.sort(list, new comparator<student>() {

@override
public int compare(student o1, student o2) {
// todo auto-generated method stub
return o1.getname().length() - o2.getname().length();
}
});


system.out.println(list);

}
}


//扩展timer类的使用

package com.baidu_02;

import java.text.parseexception;
import java.text.simpledateformat;
import java.util.date;
import java.util.timer;
import java.util.timertask;

import javax.xml.crypto.data;

public class demo08timer {
public static void main(string[] args) throws exception {

timer timer = new timer();
//在指定的时间调用方法
//安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
//timer.schedule(new mytask(), 1000, 2000);

//安排在指定的时间执行指定的任务。
simpledateformat sdf = new simpledateformat("yyyy-mm-dd hh:mm:ss");
date data = sdf.parse("2017-06-30 1:42:25");
timer.schedule(new mytask(), data);
}
}

class mytask extends timertask {

@override
public void run() {
// todo auto-generated method stub
//这里可以做一些事情,比如调用一些方法用于提醒,
system.out.println("砰 爆炸了!!!!!");
}

}


扩展:进行小数相加的类

package pack01_kuozhan;

import java.math.bigdecimal;
import java.math.biginteger;

public class demo07method {
public static void main(string[] args) {

double d1 = 0.01;
double d2 = 0.09;

double d3 = d1 + d2;

system.out.println(d3);

// '8' + '9'
// '8' - '0' + ('9'-'0')
system.out.println("----------------");
bigdecimal b1 = new bigdecimal("0.039080396803968906803969");
bigdecimal b2 = new bigdecimal("0.090830648064064846068409");

//进行小数相加的类

//相加
bigdecimal b3 = b1.add(b2);
//相乘
// bigdecimal b4 = b1.multiply(b2);
//相除
// bigdecimal b5 = b1.divide(b2);
system.out.println(b3);

system.out.println("--------------------");
//可以进行超出long范围的加法运算
biginteger bi1 = new biginteger("9068069804980694809489048904890484907");
biginteger bi2 = new biginteger("9068069804980694809489048904890484907");

biginteger bi3 = bi1.add(bi2);
system.out.println(bi3);
}
}

 

 


beans.xml

<?xml version="1.0" encoding="utf-8"?>
<beans>
<bean classname="cn.baidu.demo.student" methodname="study">
<property name="name" value="liutao"></property>
<property name="age" value="35"></property>
</bean>
</beans>

//1:创建cn.baidu.demo.student类对象,调用study方法
//2:将变量name的值设为liutao
//3:判断study方式是否有注解,如果有,获取属性值


//对xml的增删改

package pack01_kuozhan;

import java.io.filenotfoundexception;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.io.outputstream;
import java.io.unsupportedencodingexception;

import org.dom4j.document;
import org.dom4j.documentexception;
import org.dom4j.element;
import org.dom4j.io.outputformat;
import org.dom4j.io.saxreader;
import org.dom4j.io.xmlwriter;

/*
<persons>
<person id="it001">
<name>zhangsan</name>
</person>
</persons>

*/
public class demo03xml {
public static void main(string[] args) throws documentexception, ioexception {

//代码生成xml
document document = documenthelper.createdocument();

document.addelement("root");

//创建输出流
outputstream os = new fileoutputstream("root.xml");
//获取输出的指定格式
outputformat format = outputformat.createpreetyprint();

//设置编码,确保解析的xml为utf-8格式
format.setencoding("utf-8");

//xmlwriter 指定输出文件以及格式
xmlwriter writer = new xmlwriter(os,format);
//把document写入xmlfile指定的文件(可以为被解析的文件或者新创建的文件)
writer.write(document);
writer.flush();
writer.close();


//saxreader sr = new saxreader();

//document document = sr.read("persons.xml");

//获取根元素
//element rootelement = document.getrootelement();

//------------添加属性 ---------------------------
// //获取person元素
// element element = rootelement.element("person");
// //添加属性
// element.addattribute("attr", "xxx");

//------------修改元素的文本值 ---------------------------
// element element = rootelement.element("person");
// element element2 = element.element("name");
// element2.settext("lisi");

//-------------添加元素-----------------------------
// element addelement = rootelement.addelement("worker");
// addelement.settext("gongren");
// //把修改后的内存中xml写入文件

//------------删除元素-----------------------------
element element = rootelement.element("worker");
rootelement.remove(element);

outputstream os= new fileoutputstream("persons.xml");//创建输出流
outputformat format = outputformat.createprettyprint(); //获取输出的指定格式

format.setencoding("utf-8");//设置编码 ,确保解析的xml为utf-8格式

xmlwriter writer = new xmlwriter(os,format);//xmlwriter 指定输出文件以及格式
writer.write(document);//把document写入xmlfile指定的文件(可以为被解析的文件或者新创建的文件)
writer.flush();
writer.close();

}
}


//扩展:在数组中查找给出的数在数组中第几索引

package pack01_kuozhan;

import java.util.arrays;

public class demo06birnarysearch {
public static int birnarysearch(int[] array, int value){
int low = 0;
int high = array.length - 1;

while(low <= high){
int mid = (low + high) / 2;
if(value > array[mid]){
low = mid + 1;
}else if(value < array[mid]){
high = mid - 1;
}else{
return mid;
}
}

return -1;
}
public static void main(string[] args) {
int[] array = {1,2,3,4,5};

system.out.println(birnarysearch(array, 30));

}
}


扩展:
创建文档:
document document=documenthelper.createdocument();//生成xml文件
element students=document.addelement("students");//创建根元素

preparedstatement pre=con.preparestatement("select * from student"); //查询语句
resultset rs=pre.executequery(); //查询输出
while(rs.next()){
element student=students.addelement("student");//创建学生的子元素
element id=student.addelement("id"); //获取确定的值
id.settext(rs.getstring(1)); //添加到xml中
element name=student.addelement("name");
name.settext(rs.getstring(2));
element age=student.addelement("age");
age.settext(rs.getstring(3));

outputformat format=outputformat.createprettyprint(); //输出方式

xmlwriter output=new xmlwriter(new fileoutputstream("student.xml"),format); //写到文件中
output.write(document); //写入到文档中
output.close(); //关闭


解析:

saxreader sax=new saxreader(); //修改文件中的值
document doc=null;
try {
doc=sax.read(new file("student.xml"));//生成文件作为读取文件
} catch (documentexception e) {
e.printstacktrace();
}
list list=doc.selectnodes("//students/student"); //查找元素存到列表中
iterator iter=list.iterator(); //使用遍历输出
while(iter.hasnext()){
element id=(element)iter.next(); //存到连接中
preparedstatement pre1 = con.preparestatement("insert into emplement values (?,?,?)");
pre1.setint(1,integer.parseint(id.elementtext("id"))); //转换成int类型的数据
// id.elementtext("name"); //得到列名为name的数据
pre1.setstring(2,id.elementtext("name"));
pre1.setint(3,integer.parseint(id.elementtext("age")));
pre1.executeupdate(); //更新数据

}
outputformat opt=outputformat.createprettyprint(); //输出数据
xmlwriter outp;
outp=new xmlwriter(new filewriter(new file("emplement.xml")),opt); //写到新文件中
outp.write(doc); //写进文件
outp.close();


xml中schema与dtd相比, schema的优势有哪些?

schema的优点:

①.使用与xml相同的语法;

②.支持多种数据类型;

③.支持用户自定义数据类型;

④.支持名称空间。

 

beanutils工具类

package pack01_beanutils;

import java.lang.reflect.invocationtargetexception;

import org.apache.commons.beanutils.beanutils;

/*
* setproperty(object obj,string name,object value)
* 该方法给对象的成员变量赋值
* 参1:赋值的对象
* 参2:表示变量的名字
* 参3:要赋的值
*/
public class demo01setproperty {
public static void main(string[] args) throws illegalaccessexception, invocationtargetexception {

//1:创建user对象
user user = new user();

//2:调用工具类给对象成员赋值
beanutils.setproperty(user, "id", "it001"); //id --->setid() --->
beanutils.setproperty(user, "username", "lft");
beanutils.setproperty(user, "password", "123");

system.out.println(user);
}
}


package pack01_beanutils;

import java.lang.reflect.invocationtargetexception;

import org.apache.commons.beanutils.beanutils;

/*
* getproperty(object obj,string name)
* 从对象获取某个变量的值
* 参1:获取哪个对象的值
* 参2:变量的名字
*/
public class demo02getproperty {

public static void main(string[] args) throws illegalaccessexception, invocationtargetexception, nosuchmethodexception {

user user = new user("it002", "zhangsan", "12345");

//调用工具类获取变量的值
//该方法以后的用法是:获取网页表单中的数据
string id = beanutils.getproperty(user, "id"); //id --->getid();
string username = beanutils.getproperty(user, "username"); //id --->getusername();
string password = beanutils.getproperty(user, "password"); //id --->getpassword();

system.out.println(id + " " + username + "\t" + password);
}

}


package pack02_beanutils;

import java.lang.reflect.invocationtargetexception;
import java.util.hashmap;

import org.apache.commons.beanutils.beanutils;

/*
* 该方法也是给变量赋值
* populate(object bean, map<string,string[]> properties)
* 参1:表示对象
* 参2:键:变量的名字 值:变量的值,用数组表示,如果该变量不是数组,则会把 [0]赋值给变量
*/
public class demo01populate {
public static void main(string[] args) throws illegalaccessexception, invocationtargetexception {
user user = new user();

//定义map集合
hashmap<string, string[]> hm = new hashmap<string,string[]>();
//给map集合添加数据
hm.put("id", new string[]{"it001"});
hm.put("username", new string[]{"lft"});
hm.put("password", new string[]{"123"});
hm.put("hobbies", new string[]{"smokeing","girl","tableball"});
beanutils.populate(user, hm);
//setproperty()
system.out.println(user);
}
}


package com.baidu_01;

import java.util.map;

import org.apache.commons.beanutils.beanutils;

public class mybeanutils {
//方法的作用是为了获得一个类的对象,并且给这个类赋好了值
public static object mypopulate(class<?> clazz, map<string,string[]> properties) {
object bean = null;

try {
//替用户创建对象
bean = clazz.newinstance();
//给对象赋值
beanutils.populate(bean, properties);

}catch (exception e) {
//将捕捉的编译时异常转为运行时异常
throw new runtimeexception();
}

//赋值之后应该把赋值之后的对象返回
return bean;

}
}


<?xml version="1.0" encoding="utf-8"?>
<beans>
<bean classname="pack1.user">
<property name="username" value="rose"></property>
<property name="password" value="123"></property>
</bean>

<bean classname="pack2.person">
<property name="name" value="jack"></property>
<property name="age" value="22"></property>
</bean>
</beans>

package pack03_test;

import java.util.list;

import org.apache.commons.beanutils.beanutils;
import org.dom4j.document;
import org.dom4j.documentexception;
import org.dom4j.element;
import org.dom4j.io.saxreader;

public class testdemo {
public static void main(string[] args) throws exception {
//1:解析xml
//1.1 创建saxreader对象
saxreader sr = new saxreader();
//1.2 将xml读取到内存,得到document对象
document document = sr.read("data.xml");
//1.3 获取根元素
element rootelement = document.getrootelement();
//1.4获取根元素的子元素 bean
list<element> elements = rootelement.elements();
for (element element : elements) {
//1.5 获取bean的属性
string classname = element.attributevalue("classname");
//2:反射
//2.1通过类的全名获取class对象
class<?> clazz = class.forname(classname);
//2.2 创建类的对象
object obj = clazz.newinstance();
//3:获取bean的子元素
list<element> elements2 = element.elements();
for (element element2 : elements2) {//property
//3.1 获取property的属性:name value
string name = element2.attributevalue("name");
string value = element2.attributevalue("value");
//将obj对象的name变量赋值为value
beanutils.setproperty(obj,name, value);
}
system.out.println(obj);
}
}
}