XML之解析xml文件与xml文件的引入&枚举

xml

XML为可扩展标记语言

xml 可以用作配置文件, 可以作为数据的存储于交换格式

  • 标记就是指一对<>包裹起来的标签
  • 标签的名字可以自由扩展和自定义
<name>姓名</name>
<age>年龄</age>
  • html中的标签名称都是固定的,不能自由扩展
<html>
    <body>//主体部分
        <h1>标题标签</h1>
        <a></a>
    </body>
</html>

使用xml描述一个学生的数据

<!-- 用子标签描述 -->
<student id="001">
	<name>姓名</name>
    <age>年龄</age>
    <sex>性别</sex>
</student>
<!-- 用属性描述-->
<student name="张三" age="18" sex=""></student>
  • 注解开始<?xml version="1.0" encoding="UTF-8" ?>表头
  • 特殊符号 < &lt; >&gt; 这些字符是要进行转义的
  • <[CDATA[...]]> 只能写在标签内部,且被包裹的内容不被编译器编译 快捷键CD
  • 在XML中根标签只能有一个

解析xml

dom树

  • document - 文档节点
  • 标签 - 元素节点(Element)
  • 标签内部的文字 - 文本字节(Test)
  • 标签的属性 - 属性节点 (Attribute)
//获取解析器
SAXReader reader = new SAXReader();
//解析为dom树,并获得document
Document document = reader.read(new File("xml的路径"));
//得到根标签
Element root = document.rootElement();
//获取根标签下所有的子标签
List<Element> elements = root.elements("子标签名");
//遍历集合获取到每个子标签
for(Element element: elements){
    element.attribute("属性名").getValue();//得到并获取属性值
    element.element("子标签名").getTest();//获取子标签,并得到子标签文本
}

注意事项和添加标签,并将标签同步到文件中

//获取解析器对昂
SAXReader reader = newSAXReader();
//获取类路径上的xml文件,系统类加载器,可以认为是src是类路径的起点
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("xml路径");
//解析输入的xml文件,并获取到document对象
Document document = reader.read(is);
is.close();//关流释放资源

//根据文档对象获取根标签下的子标签的所有子标签
List<Element> elements = document.getRootElement().elements("根标签下的子标签名");
for(Element element : elements){
}
//给根标签添加子标签
//获取根标签
Element rootElement = document.getRootElement();
//添加一个子标签
Element elementZi = rootElement.addElement("子标签名");
elementZi.addElement("name").addText("姓名");
elementZi.addElement("age").addText("年龄");
//写入xml
XMLWriter writer = new XMLWriter(new FileWriter("xml路径"));
Writer.write(document);
writer.close();//释放资源

验证xml

dtd

dtd文件中的信息是对xml的文件进行约束的

<!ATTLIST student id CDATA #IMPLIED>  <!-- 在student上存在id属性,id是可选的-->
<!ATTLIST student id CDATA #REQUIRED>  <!-- 在student上存在id属性, id是必须的-->
schema
<?xml version="1.0" encoding="UTF-8" ?>
<!-- targetNamespace 是schema设计者自己决定的,要求唯一 -->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.itheima.com" 
        elementFormDefault="qualified"
>
    <!-- element 用来定义标签 -->
	<element name="students">
    	<complexType>
        	<!-- sequence用来定义子标签 -->
            <sequence minOccurs="0" maxOccurs="unbounded">
            	<element name="student">
                	<complexType>
                    	<sequence>
                        	<element name="name" type="string"></element>
							<element name="age" type="string"></element>
                        </sequence>
                        <!-- attribute 用来定义属性 -->
                        <attribute name="id" type="string" use="required"/>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>
对应的xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 命名空间: 防止同名标签冲突
	<a:name> 表示引入了a.xsd 的name标签
	<b:name> 表示引入了b.xsd 的name标签
	xmls - 默认命名空间,值填写xsd中 targetNamespace的值
	schemaLocation - [targetNamespace 的值] [xsd文件路径]

	schema的作用就是当编写xml文件时,给出提示
-->
<students
	xmlns:xsi="http://www.w3.org/20001/XMLSchema-instance"
    xmlns="http://www.itheima.com"
    xsi:scheamLocation="http://www.itheima.com student2.xsd"
>
    <studnet id="1">
    	<name>姓名</name>
        <age>年龄</age>
    </studnet>
</students>
非默认命名空间的例子
<?xml version="1.0" encoding="UTF-8"?>
<!--
	xmlns - 默认命名空间(只能有一个),值填写 xsd 中targetNamespace的值
	如果没有采用默认命名空间,例如xmlns:a 则该命名空间下其他标签都必须加上 a: 的前缀
-->
<a:students
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:a="http://www.itheima.com"
    xsi:schemaLocation="http://www.itheima.com student2.xsd"
>
    <a:student id="1">
    	<a:name>姓名</a:name>
        <a:age>年龄</a:age>
    </a:student>
</a:students>

枚举

枚举就是一个特殊的类, 枚举项实际上就是此类的对象,相当于枚举在定义时就把对象的个数限制了

public enum Sex{
    MALE,FEMALE;
}

重要方法

//将字符串转为枚举类型
String str = "MALE";
Sex sex = Sex.valueOf(str);//将字符串转换为枚举类型
  • values() 获得某个枚举类中所有枚举对象

switch能接收的数据类型:

  • String
  • Enum
  • byte
  • short
  • char
  • int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值