解决程序间数据传输的问题:=> json
比如 qq 之间的数据传送,用 xml 格式来传送数据,具有良好的可读性,可维护性
xml 可以做配置文件
① xml 文件做配置文件可以说非常的普遍
② 比如我们的 tomcat 服务器的 ll
xml 可以充当小型的数据库 => 程序自己的数据格式存放
xml 文件做小型数据库,也是不错的选择,我们程序中可能用到的数据,如果放在数据库中读取不合适(因为你要增加维护数据库工作),可以考虑直接用 xml 来做小型数据库 ,而且直接读取文件显然要比读取数据库快
<?xml version="1.0" encoding="UTF-8" ?>
<!--解读:1 xml :表示该文件的类型 xml2 version="1.0"版本3 encoding="UTF-8" 文件编码4. students: root元素/根元素, 程序员自己来定5. <student></student> 表示students一个子元素, 可以有多个6. id就是属性 name, age, gender 是student元素的子元素
-->
<students><student id="100"><name>jack</name><age>10</age><gender>男</gender></student><student id="200"><name>mary</name><age>18</age><gender>女</gender></student>
</students>
<?xml version="1.0" encoding="UTF-8" ?>
XML 声明放在 XML 文档的第一行
XML 声明由以下几个部分组成:
① version —文档符合 XML1.0 规范,我们学习 1.0
② encoding —文档字符编码,比如 “utf-8”
1、元素语法要求:
<?xml version="1.0" encoding="utf-8" ?>
<!--解读:1.每个XML文档必须有且只有一个根元素。2.根元素是一个完全包括文档中其他所有元素的元素。3.根元素的起始标记要放在所有其他元素的起始标记之前。4.根元素的结束标记要放在所有其他元素的结束标记之后5.XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式包含标签体:<a>www.sohu</a>不含标签体的:<a></a>, 简写为:<a/>6.一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套7. 叫法student 元素,节点,标签
-->
<students><student id="100"><name>jack</name><age>10</age><gender>男</gender></student><student id="200"><name>mary</name><age>18</age><gender>女</gender></student><school>清华大学</school><city/>
</students>
2、 XML 元素指 XML 文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式,例如:
<a>www.sohu</a>
<a></a>
,简写为:<a/>
<a>welcome to <b>www.sohu</a></b>
这种写法就是错误的3、特别提示:在很多时候,说 标签、元素、节点是相同的意思
4、XML 元素命名规则
<P>
和<p>
是两个不同的标记:
<book_title>hello</book_title>
<?xml version="1.0" encoding="utf-8" ?>
<!--解读:1.区分大小写,例如,<P>和<p>是两个不同的标记。2.不能以数字开头。3.不能包含空格。4.名称中间不能包含冒号(:)。5.如果标签单词需要间隔,建议使用下划线 比如 <book_title>hello</book_title>
-->
<students><student id="100"><name>jack</name><age>10</age><gender>男</gender><email>jack@sohu</email><Email>jack2@sohu</Email><job>java工程师</job><book_name>三国</book_name></student><student id="200"><name>mary</name><age>18</age><gender>女</gender></student>
</students>
<Student ID="100"><Name>TOM</Name>
</Student>
<?xml version="1.0" encoding="utf-8" ?>
<!--解读:1.属性值用双引号(")或单引号(')分隔(如果属性值中有',用"分隔;有",用'分隔)2.一个元素可以有多个属性,它的基本格式为:<元素名 属性名="属性值">3.特定的属性名称在同一个元素标记中只能出现一次4.属性值不能包括& 字符
-->
<students><!--举例:id='01' 也是正确写法如果属性值有" 则使用' 包括属性 比如 id="xxx'yyy"如果属性值有' 则使用" 包括属性 比如 id='xxx"yyy'属性名在同一个元素标记只能出现一次 <stduent id="01" id="03"> 错误的属性值不能包括& 字符 比如: <stduent id="0&1"> 是错误的--><student id="100"><name>jack</name><age>10</age><gender>男</gender></student><student id="200"><name>mary</name><age>18</age><gender>女</gender></student>
</students>
<!--这是一个注释- ->
<Name <!--the name-->>TOM</Name
<![CDATA[
这里可以把你输入的字符原样显示,不会解析 xml
]]>
<?xml version="1.0" encoding="utf-8"?>
<!--解读:<![CDATA[这里可以把你输入的字符原样显示,不会解析 xml]]>
-->
<students><stduent id="01"><name>tom</name><gender>男</gender><age>18</age><!--举例说明:下面是一段js的代码片段. 直接放在<code></code>标签间,语法错误使用CDATA节来处理即可.<script data-compress=strip>function h(obj){obj.style.behavior='url(#default#homepage)';var a = obj.setHomePage('//www.baidu/');}</script>--></stduent><stduent id="02"><name>scott</name><gender>女</gender><age>17</age><code><!--如果希望把某些字符串,当做普通文本,使用CDATA包括 --><![CDATA[<script data-compress=strip>function h(obj){obj.style.behavior='url(#default#homepage)';var a = obj.setHomePage('//www.baidu/');}</script>]]></code></stduent>
</students>
转义符 | 符号 |
---|---|
< | < |
> | > |
& | & |
" | " |
' | ’ |
<?xml version="1.0" encoding="utf-8" ?>
<!--解读:对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理比如 > < & ' ""
-->
<students><stduent id="01"><name>tom</name><gender>男</gender><age>28</age><!--使用转义字符表示一些特殊字符<resume>年龄<100 &版权</resume>--><resume>年龄<10 > &</resume></stduent><stduent id="02"><name>scott</name><gender>女</gender><age>17</age></stduent>
</students>
遵循如下规则的 XML 文档称为格式正规的 XML 文档:
<?xml version="1.0" encoding="utf-8"?>
SAXReader reader = new SAXReader(); //创建一个解析器
Document document = ad(new File("l")); //获得 XML Document
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
Document document = ateDocument(); //创建根节点
Element root = document.addElement("members");
<?xml version="1.0" encoding="utf-8"?><students> <student id="01"> <name>小龙女</name> <gender>女</gender> <age>19</age> <resume>古墓派掌门人</resume> </student> <student id="02"> <name>欧阳锋</name> <gender>男</gender> <age>21</age> <resume>白驼山,蛤蟆神功</resume> </student>
</students>
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.jupiter.api.Test;import java.io.File;
import java.io.FileOutputStream;
import java.util.List;/*** @Author: 谢家升* @Date: 2022/2/15-02-15-8:25* @Version: 1.0*/
public class Dom4j_ {/*** 演示如何加载xml文件*/@Testpublic void loadXML() throws DocumentException {//得到一个解析器SAXReader reader = new SAXReader();//代码技巧->debug 看看document对象的属性//分析了document对象的底层结构Document document = ad(new File("l"));System.out.println(document);}/*** 遍历所有的student信息*/@Testpublic void listStus() throws DocumentException {//得到一个解析器SAXReader reader = new SAXReader();//代码技巧->debug 看看document对象的属性//分析了document对象的底层结构Document document = ad(new File("l"));//1. 得到rootElement, 你是OOPElement rootElement = RootElement();//2. 得到rootElement的student ElementsList<Element> students = rootElement.elements("student");//System.out.println(student.size());//2for (Element student : students) {//element就是Student元素/节点//获取Student元素 的name ElementElement name = student.element("name");Element age = student.element("age");Element resume = student.element("resume");Element gender = student.element("gender");System.out.println("学生信息= " + Text() + " " + Text() +" " + Text() + " " + Text());}}/*** 指定读取第一个学生的信息 就是 dom4j+xpath*/@Testpublic void readOne() throws DocumentException {//得到一个解析器SAXReader reader = new SAXReader();//代码技巧->debug 看看document对象的属性//分析了document对象的底层结构Document document = ad(new File("l"));//1. 得到rootElement, 你是OOPElement rootElement = RootElement();//2. 获取第一个学生Element student = (Element) rootElement.elements("student").get(1);//3. 输出该信息System.out.println("该学生的信息= " + student.element("name").getText() + " " +student.element("age").getText() + " " + student.element("resume").getText() +student.element("gender").getText());//4. 获取student元素的属性System.out.println("id= " + student.attributeValue("id"));}/*** 加元素(要求: 添加一个学生到xml中) [不要求,使用少,了解]* @throws Exception*/@Testpublic void add() throws Exception {//1.得到解析器SAXReader saxReader = new SAXReader();//2.指定解析哪个xml文件Document document = ad(new File("l"));//首先我们来创建一个学生节点对象Element newStu = ateElement("student");Element newStu_name = ateElement("name");//如何给元素添加属性newStu.addAttribute("id", "04");newStu_name.setText("宋江");//创建age元素Element newStu_age = ateElement("age");newStu_age.setText("23");//创建resume元素Element newStu_intro = ateElement("resume");newStu_intro.setText("梁山老大");//把三个子元素(节点)加到 newStu下newStu.add(newStu_name);newStu.add(newStu_age);newStu.add(newStu_intro);//再把newStu节点加到根元素RootElement().add(newStu);//直接输出会出现中文乱码:OutputFormat output = atePrettyPrint();output.setEncoding("utf-8");//输出的编码utf-8//把我们的xml文件更新// lets write to a file//new FileOutputStream(new File("l"))//使用到io编程 FileOutputStream 就是文件字节输出流XMLWriter writer = new XMLWriter(new FileOutputStream(new File("l")), output);writer.write(document);writer.close();}/*** //删除元素(要求:删除第一个学生) 使用少,了解* @throws Exception*/@Testpublic void del() throws Exception {//1.得到解析器SAXReader saxReader = new SAXReader();//2.指定解析哪个xml文件Document document = ad(new File("l"));//找到该元素第一个学生Element stu = (Element) RootElement().elements("student").get(2);//删除元素Parent().remove(stu);
// //删除元素的某个属性
// ve(stu.attribute("id"));//更新xml//直接输出会出现中文乱码:OutputFormat output = atePrettyPrint();output.setEncoding("utf-8");//输出的编码utf-8//把我们的xml文件更新XMLWriter writer = new XMLWriter(new FileOutputStream(new File("l")), output);writer.write(document);writer.close();System.out.println("删除成功~");}/*** //更新元素(要求把所有学生的年龄+3) 使用少,了解* @throws Exception*/@Testpublic void update() throws Exception {//1.得到解析器SAXReader saxReader = new SAXReader();//2.指定解析哪个xml文件Document document = ad(new File("l"));//得到所有学生的年龄List<Element> students = RootElement().elements("student");//遍历, 所有的学生元素的age+3for (Element student : students) {//取出年龄Element age = student.element("age");age.setText((Integer.Text()) + 3) + "");}//更新//直接输出会出现中文乱码:OutputFormat output = atePrettyPrint();output.setEncoding("utf-8");//输出的编码utf-8//把我们的xml文件更新XMLWriter writer = new XMLWriter(new FileOutputStream(new File("l")), output);writer.write(document);writer.close();System.out.println("更新成功~");}
}
<?xml version="1.0" encoding="UTF-8" ?>
<books><book id="100"><name>西游记</name><author>吴承恩</author><price>80</price></book><book id="200"><name>三国</name><author>罗贯中</author><price>100</price></book>
</books>
思路分析 + 代码实现
(1)遍历所有的 book 元素->得到每个 book 元素的信息
(2)创建一个 Book 类,根据 book 元素信息来创建 book 对象
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.File;
import java.util.List;/*** @Author: 谢家升* @Date: 2022/2/15-02-15-10:38* @Version: 1.0*/
public class Homework {public static void main(String[] args) throws DocumentException {//1.得到一个解析器SAXReader reader = new SAXReader();//代码技巧--->debug 看看document对象的属性//2.指定解析哪个XML文件Document document = ad(new File("l"));//3.遍历所有的book元素List<Element> books = RootElement().elements("book");for (Element book : books) {//取出book元素所有信息Element name = book.element("name");Element author = book.element("author");Element price = book.element("price");String id = book.attributeValue("id");//创建成book对象Book book1 = new Book();book1.setId(Integer.parseInt(id));book1.Text());book1.Text());book1.setPrice(Double.Text()));System.out.println("book1对象信息= " + book1);}}
}
本文发布于:2024-02-05 05:34:40,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170725298963476.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |