可扩展:完全自定义,按照自己的规则来定义
标记:能让计算机认识的信息符号
书本教材的编号======>证明书是你的
身份证号码唯一的======>证明自己的身份
XML:
1.可扩展标记语言
2.符号w3c标准
3.着重数据的保存,不着重数据的显示
4.无需预编译功能
W3C:国际组织,万维网联盟组织,规定了xml,html,css,js,数据库...一系列的规范
以xml文件作为后缀名的文件,我们称之为xml文件
注意点:
1.根节点:在当前文件中只能有一个
2.所有的节点都是成对出现的
<学校>开放标签
</学校>闭合标签
3.所有的节点必须是正确的嵌套
4.xml文件中,严格区分大小写
xml的节点结构,我们称之为DOM树===>整个xml节点结构像一个倒挂的树
DOM:(Document Object Model)==>文档对象模型
特殊字符的转换
> >
< <
‘‘ '
" "
& &
(空格)
DTD文件(Document Type ):针对于xml文件的约束文件
<!ELEMENT package (result-types?, interceptors+, default-interceptor-ref*)>
ELEMENT:元素package
()里面的内容,称之为子元素
,:括号里元素的前后位置
?:子元素最多出现一次
+:子元素至少出现一次
*:子元素至少出现0次,最多出现N次
<!ATTLIST package
name CDATA #REQUIRED
extends CDATA #IMPLIED
namespace CDATA #IMPLIED
abstract CDATA #IMPLIED
strict-method-invocation CDATA #IMPLIED
externalReferenceResolver NMTOKEN #IMPLIED
>
ATTLIST:package元素中可以包含的属性
name,extends属性名
CDATA:Character Data字符数据==>解析器不会解析的文本
PCDATA:Parsed Character Data被解析的字符数据====>解析器会解析的文本
#REQUIRED:属性是必须的
#IMPLIED:属性不是必须的
Schema 可以替换DTD,文件的扩展名是xsd(xml Schema Definition)
解析xml文件
1.DOM:基于xml文档树的解析,把文件中的内容全部读到内存中,占内存,消耗资源多
2.SAX:基于事件的解析,不会把文件中的全部内容读到内存中,占用资源少
3.JDOM:针对于java的特定模型!满足2 8原则!自身没有解析器,依赖于SAX2的解析器
4.DOM4j:是JDOM的一个分支,开放源码.性能优异,功能强大,依赖于SAX解析器
解析xml文件的思路:
1.把xml文件理解成一个DOM树
2.找到DOM树的根节点
3.然后根据需求去遍历
4.找到自己想要的节点
任务:
实现对xml文件中节点(元素)的增删查改
获取dom树:
SAXReader reader=new SAXReader();//创建解析器对象
Document document = reader.read(file);//获取dom树
Element root= document.getRootElement();//获取根节点
把内存中的数据保存在xml文件中,持久化数据:
//创建输出流格式化对象
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("设置编码格式");
XMLWriter writer=new XMLWriter(new FileWriter(file), format);
新增节点:
Element classElement = root.addElement("class");//在根节点下创建一个新的节点class
classElement.addAttribute("name", "四班");//给class节点新增属性,
name:属性名,四班:属性值
Element studentElement = classElement.addElement("student");//再次增加子节点 student
studentElement.addAttribute("name", "啦啦4");// 给student节点新增属性
studentElement.addText("有点浪");//新增文本节点
删除节点:
Iterator<Element> classes = root.elementIterator();//从根节点中获取所有的子节点
while(classes.hasNext()){
Element clazz = classes.next();//获取具体的一个子元素
if(clazz.attributeValue("name").equals(className)){
//删除节点,不允许自杀,必须通过父节点删除
classes.remove();
}
}
修改节点:
clazz.setAttributeValue("location", newClassName);//属性为location的值修改为新的 值
查询节点:
System.out.println("班级名称:"+clazz.attributeValue("name"));
//如果结点中有文本节点
if(!student.getTextTrim().equals("")){
System.out.println("这个学生的描述信息是:"+student.getTextTrim());
}