XML可扩展的标记语言

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类:成员变量:id name age gender
xml写法:

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

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

&gt;    >
&amp;    &
&apos;   ‘
&quot;   “

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包

  1. 写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);
      }

   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值