您的位置:首页 > 其它

XML可扩展的标记语言

2018-03-22 16:35 267 查看

XML

可扩展的标记语言

标记:标签

<name>张三</name>


xml是一种文件格式

xml文件的用处:

作为程序的配置文件使用的

配置文件:保存一些程序需要的固定的信息

xml文件内容是给程序看的

Xml语法:

处理指令:

XML建议在文件最开始使用一个处理指令:

<?xml version=”1.0” encoding=”UTF-8”?>


标记(标签)tag:

标记语法:

<开始标签></结束标签>
<自结束标签/>
如果标签中间没有内容,此时可以采用自结束标签


注意点:

1. 严格区分大小写

2. 标签要结束

3. 标签可以嵌套使用

注释:

<! -- 注释内容 -- >


元素 Element:一对标签

遵循原则:

    xml文件中必须也只能有一个根元素,可以在此根元素下定义多个子元素

    练习:

定义xml文件,在此文件中定义多个Student信息

<?xml version="1.0" encoding="UTF-8"?>
<!-- 根标签/根元素 -->
<personList>
<!-- 子标签 -->
<person>
<id>1</id>
<name>tom</name>
<age>23</age>
</person>
<person>
<id>2</id>
<name>jack</name>
<age>33</age>
</person>

</personList>


属性Attribute

1. 属性是定义在开头标签中的,一个标签中可以定义多个属性,多个属性是无序的

2. 属性的属性值必须用引号引起来(可以是”“,也可以是”)

3. 一些唯一的值通常都会定义出属性

4. Student对象:

javaBean类:成员变量:
4000
id name age gender

xml写法:

<student id="1" name="tom" age="23" gender="女/>


实体替换(转义)

在xml中,如果要使用一些具有特定意义的字符的本意,此时就需要使用实体替换(转义)

常见的转义字符:

< <

>    >
&    &
'   ‘
"   “


CDATA段:

对于大量的文本,这些本文出现了大量的特殊字符,此时若想将这些字符作为本意输出,可以不使用实体替换,可以利用CDATA包裹起来,这样就可以不用转义了.

格式:

<![CDATA[文本内容]]>


<?xml version="1.0" encoding="UTF-8"?>
<list>
<student>
<name>tom</name>
<age>23</age>
<desc>
<![CDATA[此学生的年龄<学生平均年龄,
'性格'很温和,成绩&等级偏上]]>
</desc>
</student>

</list>


XML API

标准的 W3C SAX DOM API非常难以使用,开源社区提供了Dom4j API 非常简便易用,已经成为XML处理的标准

DOM(document)树

xmlDOM文件:

根元素

-子元素

-子元素

-子元素

对XML使用DOM4j API进行操作,必须先导入dom4j的jar包

写XML

i. 步骤:

a) 创建DOM树

b) 调用XMLWriter输出流将domcument对象写入文件

i. 注意点:格式文件:使用OutputFormat

/**
* 创建student.xml文件并向文件中写入dom树数据
* 步骤:
*     1.创建Dom树
*     2.使用XMLWriter对象将docuemnt对象写入文件
注意:格式问题:使用OutputFormat
* @author adminitartor
*
*/
public class WriteXmlDemo {
public static void main(String[] args) throws IOException {
//创建DOM树
Document dom = DocumentHelper.createDocument();
//添加根元素
Element root = dom.addElement("list");
//在根元素添加student子元素
Element student = root.addElement("student");
//在student标签上添加id属性
student.addAttribute("id", "1001");
//添加子标签
Element name = student.addElement("name");
//向标签中添加内容
name.addText("tom");
//添加age子标签
Element age  = student.addElement("age");
//给age标签中间添加内容
age.addText("23");

System.out.println(dom.asXML());

//用输出流向文件中写入数据
FileOutputStream fos = new
FileOutputStream("student.xml");
//创建OutputFormat类对象
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new
XMLWriter(fos, format);
writer.write(dom);
writer.close();
}

}


运行结果如下



方法:

添加元素:addElement(String name)

向标签中添加文本:addText(String content)

添加属性以及属性值:addAttribute(String name,String value)

a) 练习:

现从数据库查询出了学生列表(保存在集合中),现要求将查询出的所有学生信息写入student.xml中

1. 定义Student类

2. 测试类中:

a) 创建集合

b) 将集合中的student数据写入xml文件

/**
* 将一个集合中的所有student对象的信息写入
* xml文件
* @author adminitartor
*
*/
public class WriteXmlDemo02 {
public static void main(String[] args) throws IOException {
//创建集合用于保存多个Student对象
List<Student> list = new ArrayList<>();
for(int i=1;i<=5;i++){
Student student = new Student(i, "学生"+i, 23+i, 90.5+i);
list.add(student);
}
//创建studentlist.xml并向文件中写入数据
//创建DOM树
Document doc = DocumentHelper.createDocument();
//创建标签元素
Element root = doc.addElement("studentList");

for (Student stu : list) {
Element student = root.addElement("student");
//创建属性
student.addAttribute("id", stu.getId().toString());
//创建子标签
Element name = student.addElement("name");
//在name标签中添加内容
name.addText(stu.getName());
Element age = student.addElement("age");
age.addText(stu.getAge().toString());
Element score = student.addElement("score");
score.addText(stu.getScore().toString());
}

//向文件中写入Document对象
FileOutputStream fos =
new FileOutputStream("studentList.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(fos, format);
writer.write(doc);

writer.close();
}

}


定义 Student类 如下

注意Student中的属性定义的类型,包装类,为什么么?



运行结果



2. 解析xml

写XML步骤:

1. 写出Document对象

2. 通过流将此对象写入文件

解析XML步骤:

1. 通过输入流来读取xml文件的内容 - Document对象

2. 通过docuement对象获取dom树中的标签元素-Element对象

3. 从Element对象中获取标签元素中的属性值,文本内容

方法:

getRootElement(); - 获取根元素

elements() - List

获取指定元素下的所有子元素

element(String name) - Element

获取指定元素下指定名称的子元素

elements(String name)-List

获取指定元素下指定名称的所有子元素

getText() :String

获取元素中间的文本内容

elementText(String name)

获取指定元素中间的文本内容

attribute(String name ) :Attribute:

获取指定名称的属性对象

getValue() :String :获取属性值

attributeValue(String name) – String :

获取指定名称的属性的属性值

案例:

   读取studentList.xml文件中的所有学生信息,将读取到的信息封装到Student对象中保存入集合,最后遍历集合。

   分析:熟悉SAXReader 里边的方法,获取根元素,子元素,元素的属性及属性值,元素中间的文本内容

public static void main(String[] args) throws FileNotFoundException, DocumentException {
//通过输入流对象读取xml文件的内容得到Document对象
FileInputStream fis = new
FileInputStream("studentList.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(fis);
//获取document对象下的根标签
Element root = doc.getRootElement();
//得到所有的student标签
List<Element> list = root.elements("student");
//创建集合保存Student对象
List<Student> studentList = new ArrayList<>();

//对list集合进行遍历,对遍历到的标签对象进行解析
for (Element ele : list) {
//获取此元素的属性值
//        Attribute attribute = ele.attribute("id");
//        //获取此属性对象的属性值
//        String id = attribute.getValue();
//等同于以上两行代码的作用
int id = Integer.parseInt(ele.attributeValue("id"));
//获取此元素下所有的子元素的文本内容
Element name = ele.element("name");
//获取此标签中间的文本内容
String nameVal = name.getText();
//等同于以上两行代码的作用
//        String nameVal = ele.elementText("name");
//获取子标签age,score中间的文本内容
int age = Integer.parseInt(ele.elementText("age"));
double score = Double.parseDouble(ele.elementText("score"));
//创建Student对象并存入集合
Student student = new Student(id, nameVal, age, score);
studentList.add(student);
}

//遍历保存Student对象的集合
for (Student student : studentList) {
System.out.println(student);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: