2021-04-25

Java 解析 XML

XML

1.XML 简介
XML Extensible Markup Language 的缩写,即可扩展标记语言。是 一种简单的数据存储语言,使用一系列简单的标记来描述数据。
2.XML 特点
1 XML 与操作系统、编程语言等开发平台都无关。
2 、规范统一。
3.XML 声明
<?xml version="1.0" encoding="UTF-8"?>
表示 XML 声明,用以标明该文件是一个 XML 文档,它定义了 XML 的 版本和所使用的编码等信息。XML 包括:
1 version: 文档符合 XML1.0 规范;
2、 Encoding: 文档字符编码,默认为“UTF-8”;
4.XML 标签
用尖括号 <> 括起来的各种标签。标签成对使用来界定字符数据。
5.XML 元素
每个 XML 文档有且仅有
一个根元素,根元素特点如下:
1、 根元素包括文档中所有其它元素;
2 、根元素的起始标签要放在所有其它元素之前;
3 、根元素的结束标签要放在所有其它元素之后;
6.XML 属性
< student age = " 31 " >中的 age 即为 student 的属性, 31 为属性值。
一个元素可以有多个属性,多个属性之间用空格隔开。
7.XML 中的特殊字符的处理
<![CDATA[
要处理的特殊字符。。。
]]>
8.XML 中的注释
注释的语法为: <!--这是注释的内容 -->
9.XML 文档格式良好
1、 必须有 XML 声明;
2、 必须有且仅有一个根元素;
3 、标签大小写敏感;
4、 属性值用双引号;
5 、标签成对;
6 、元素正确嵌套;
10. XML 优势
1 ,数据存储
2 ,数据交换
3 ,数据配置
11. XML 声明命名空间
命名空间是在 XML 文档中可以用作元素或属性名称的名称集合,它
们标识来自特定域(标准组织、公司、行业)的名称。语法:
xmlns:[prefix]=”命名空间的 URI”
12. XML 文件的解析
1 DOM 技术
2 SAX 技术
3 JDOM 技术
4 DOM4J 技术 (异能优异,功能强大,简单易用)
13. 使用 DOM4J 解析 XML 文件
1 ,导入 dom4j jar 包;
2 ,指定要解析的 xml 文件;
3 ,把 xml 文件转换成 Document;
4 ,获取节点属性或文本内容;
14. 使用 DOM4J XML 文件案例:
1、导入dom4j-1.6.1.jar
2、books.xml 文件内容如下:        (该文件位置在项目根目录下。)
 
<?xml version="1.0" encoding="GBK"?>

<books>
    <!--books根元素,根节点-->
    <book id = "101">
        <!--id = “101” 是属性-->
        <name>Java从入门到精通</name>
        <author>Tony</author>
        <price>55.80</price>
    </book>

    <book id = "102">
        <name>MySql从入门到精通</name>
        <author>Tony</author>
        <price>75.80</price>
    </book>

    <book id = "103">
        <name>HTML从入门到精通</name>
        <author>Tony</author>
        <price>69.80</price>
    </book>
</books>

3、在src的包里建一个ReadXML.class的类

public class ReadXML {

    public static void main(String[] args) {
        List<Books> list = readXmlFile();
        for (Books b: list) {
            System.out.println(b.toString());
        }
    }

    //解析xml ,读取里面的内容
    private static List<Books> readXmlFile() {
        //1.添加dom-1.6.1.jar
        SAXReader sax = new SAXReader();
        List<Books> list = new ArrayList<>();
        try {
            //books.xml 必须放在项目的根目录上
            Document doc = sax.read("books.xml");
            //获取xml文件中的根元素
            Element root = doc.getRootElement();
            System.out.println(root.getName());  //books
            //获取xml文件中的根元素下面的三个子元素
            Iterator<Element> it = root.elementIterator();
            while (it.hasNext()){
                Element e = it.next();
                System.out.println(e.getName());
                //获取book的属性id
                Attribute attr = e.attribute("id");
                String id = attr.getValue();
                System.out.println("id = " + id);


                //继续获取book元素下面的三个子元素
                Iterator<Element> its = e.elementIterator();
                //定义一个字符串数组,用来存储下面三个子元素
                String[] sts = new String[3];
                //定义一个计数器,也是索引
                int i = 0;
                while(its.hasNext()){
                    Element elet = its.next();
                    String text = elet.getText();
                    sts[i] = text;
                    i++;
                }
                Books b = new Books(id,sts[0],sts[1],sts[2]);
                list.add(b);

            }

        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return list;
    }
}
16. 使用 DOM4J 读写 XML 文件总结:
 
在src的包里建一个WriteXML.class的类
public class WriteXML {

    public static void main(String[] args) {

        //写xml;
        writeXml();
    }

    private static void writeXml() {
        //输出流格式化
        OutputFormat format = OutputFormat.createPrettyPrint();
        //设置编码格式
        format.setEncoding("UTF-8");
        //创建一个document对象
        Document doc = DocumentHelper.createDocument();
        //创建根元素的节点
        Element root = doc.addElement("books");
        //根据根元素创建子元素

        for (int i = 0; i < 4; i++) {
            Element ele = root.addElement("book");
            //创建属性
            ele.addAttribute("id","1001"+i);
            //创建三个子元素
            Element name = ele.addElement("name");
            Element author = ele.addElement("author");
            Element price = ele.addElement("price");
            //给子元素赋值
            name.addText("人生"+i);
            author.addText("路遥"+i);
            price.addText("106.00");
        }

        //开始准备写入数据
        XMLWriter writer = null;
        try{
            writer = new XMLWriter(new FileWriter("out.xml"),format);
            writer.write(doc);
            System.out.println("out.xml文件写入完成!");
        } catch (IOException e){
            e.printStackTrace();
        } finally {
            //关闭
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
}

在项目根目录可以看到写入的out.xml 文件

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

<books>
  <book id="10010">
    <name>人生0</name>
    <author>路遥0</author>
    <price>106.00</price>
  </book>
  <book id="10011">
    <name>人生1</name>
    <author>路遥1</author>
    <price>106.00</price>
  </book>
  <book id="10012">
    <name>人生2</name>
    <author>路遥2</author>
    <price>106.00</price>
  </book>
  <book id="10013">
    <name>人生3</name>
    <author>路遥3</author>
    <price>106.00</price>
  </book>
  
</books>

 

使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03
这里是使用 Python 的 PyMySQL 完成上述任务的代码: ```python import pymysql # 连接数据库 conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', database='test') # 创建游标 cur = conn.cursor() # 创建 users 表 cur.execute(''' CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(20), age INT ) ''') # 创建 orders 表 cur.execute(''' CREATE TABLE orders ( id INT PRIMARY KEY, order_date DATE, amount INT, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id) ) ''') # 插入数据 users_data = [ (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28) ] orders_data = [ (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4) ] for user in users_data: cur.execute('INSERT INTO users VALUES (%s, %s, %s)', user) for order in orders_data: cur.execute('INSERT INTO orders VALUES (%s, %s, %s, %s)', order) # 提交事务 conn.commit() # 查询语句 # 1. 查询订单总金额 cur.execute('SELECT SUM(amount) FROM orders') print(cur.fetchone()[0]) # 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 cur.execute('SELECT ROUND(AVG(age), 2) FROM users') print(cur.fetchone()[0]) # 3. 查询订单总数最多的用户的姓名和订单总数。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_orders DESC LIMIT 1 ''') print(cur.fetchone()) # 4. 查询所有不重复的年龄。 cur.execute('SELECT DISTINCT age FROM users') print([row[0] for row in cur.fetchall()]) # 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 cur.execute('SELECT SUM(amount) FROM orders WHERE order_date BETWEEN "2021-09-01" AND "2021-09-04"') print(cur.fetchone()[0]) # 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders FROM users JOIN orders ON users.id = orders.user_id WHERE age <= 25 GROUP BY users.id ORDER BY total_orders DESC ''') print(cur.fetchall()) # 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC LIMIT 3 ''') print(cur.fetchall()) # 8. 查询订单总金额最大的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC LIMIT 1 ''') print(cur.fetchone()) # 9. 查询订单总金额最小的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount ASC LIMIT 1 ''') print(cur.fetchone()) # 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 cur.execute('SELECT * FROM users WHERE name LIKE "%李%" ORDER BY name ASC') print(cur.fetchall()) # 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 cur.execute('SELECT * FROM users WHERE age > 20 ORDER BY age DESC LIMIT 5') print(cur.fetchall()) # 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC ''') print(cur.fetchall()) # 关闭游标和连接 cur.close() conn.close() ``` 注意:在运行代码之前,需要先安装 PyMySQL 模块,可以使用以下命令进行安装: ``` pip install pymysql ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值