XML的语法
1.xml是由自定义的标签组成
<开始标签>标签体</结束标签>
<自闭合标签/>
2.xml文件的语法
1)必须要有一个文档声明
<?xml version="1.0" encoding="UTF-8" ?>
2)只有一个根标签
3)特殊字符 如< > & 必须使用特殊的比较进行代替
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
4)CDATA区,数据可以被原样显示,不被当做标签解析
<![CADATA[内容]]>
3.示例
<?xml version="1.0" encoding="utf-8" ?>
<!--本文件用于描述多个学生的信息-->
<!--根标签-->
<students xmlns="http://www.itheima.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itheima.com student.xsd">
<!--第一个学生信息-->
<student id ="1">
<name>张三</name>
<age>23</age>
<!-->; < ;& ;' ;";有特殊的字符表示
<info>学生的信息 < > &'"</info>
<message> <![CDATA[文本内容<< >>]]]> </message>-->
</student>
<!--第二个学生信息-->
<student id ="2">
<name>李四</name>
<age>24</age>
</student>
</students>
XML的解析和约束文档引入
<1>schema约束文档[本质也是一个xml文档]
<?xml version="1.0" encoding="UTF-8" ?>
<!--Xml的约束文档[schema]-->
<!--被约束目标-->
<!--约束目标-->
<!--文件良好-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itheima.com"
elementFormDefault="qualified">
<!--定义students复杂元素-->
<element name ="students">
<complexType>
<sequence>
<!--定义student复杂元素-->
<element name ="student" maxOccurs="unbounded">
<complexType>
<sequence>
<!--定义name和age简单元素-->
<element name ="name" type="string"></element>
<element name ="age" type="int"></element>
</sequence>
<!--引入简单标签属性required必须的 optional可选的-->
<attribute name ="id" type="string" use="required"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
<2>约束文档引入[xml根标签属性内定义]
<students xmlns="http://www.itheima.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itheima.com student.xsd">
<3>XML文档解析
利用dom4j解析文档,需要导入相应的jar包
domr4点击下载
//利用dom4j解析xml文件
public class XmlParse {
public static void main(String[] args) throws DocumentException {
//1.获取一个解析器对象[字符流]
SAXReader saxReader = new SAXReader();
//2.利用解析器把xml文件加载到内存中,并返回一个文档对象
Document document = saxReader.read("day17_myXml\\xml\\student.xml");
//3.获取到根标签
Element rootElement = document.getRootElement();
//4.通过根标签来获取student标签
//elements();可以获取调用者所有的子标签,并以集合的形式返回
//List list = rootElement.elements();
//elements("student");可以获取调用者所有指定的子标签,并以集合的形式返回
List<Element> studentElements = rootElement.elements("student");
//System.out.println(studentElements.size());
//5.遍历集合,得到每一个student标签
ArrayList<Student> list = new ArrayList<Student>();
for (Element element : studentElements) {
//element依次表示每一个student标签
//获取id这个属性对象
Attribute id = element.attribute("id");
//获取id的属性值
String idValue = id.getValue();
//获取name这个标签对象,再获取标签体[具体文本内容]
String name = element.element("name").getText();
//获取age这个标签对象,再获取标签体[具体文本内容]
String age = element.element("age").getText();
//每次获取标签值再封装成一个学生对象存入集合中
list.add(new Student(idValue, name, Integer.parseInt(age)));
}
//遍历学生集合
for (Student student : list) {
System.out.println(student);
}
}
}
打印结果:
------------------------------------------------------
Student{id='1', name='张三', age=23}
Student{id='2', name='李四', age=24}