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}