什么是XML
- XML指可扩展标记语言
- XML是一种很像HTML的标记语言
- XML的设计宗旨是传输数据,而不是显示数据
- XML的标签没有被预定义,您需要自行定义标签
- XML被设计为具有自我描述性
- XML是W3C的推荐标准
XML和HTM的差异
- XML被设计用来传输和存储数据,其焦点是数据的内容
- HTNL被设计用来显示数据,其叫焦点是数据的外观
- HTML旨在显示信息,xml旨在上传输数据
通过XMl您可以发明自己的标签,这是因为XML语言没有预定的标签,允许XML传作定义自己的标签和文档结构
XML树结构
//第一行是XML的声明,它定义XML是1.0版本和所使用的编码是UTF-8 <?xml version="1.0 encoding="UTF-8"?> //根元素开头(像在说:“本本文是一个便签”) <note> //子元素 <to>Tove</to> <from>Jani</from> <body>Don't on</body> //根元素结尾 </note>
注意:XML文档必须包含根元素,该元素是所有元素的父元素
XML语法
必须要有根元素就不用说了
声明:xml声明文件是可选的,如果存在必须放在文档第一行
<?xml version="1.0" encoding="UTF-8"?>
所有XML标签都必须有一个闭合标签
<p>jjjjj</p>
xml对大小写敏感
<--正确--> <love>你爱翠花</love> <--错误--> <Love>你爱翠花</love>
必须正确嵌套,属性值加双引号
<--错误--> <p><li> fsfs </p></li> <--正确--> <p><li>fsfs</li></p> <--属性值--> <book id="aa"></book>
实体引用
如果您把字符“<”放在XML元素中,会发生错误,这是因为解析器会把它当作新元素开始
为了必变这个错误用是实体引用来代替
&It; < >; > &; &
&apos; '
"; " xml中的注释
<!-- 注释 -->
xml中有连续多个空格会裁减程一个
XML以LF存储换行
回车符(CR)换行(LF)
CDATA
<![CDATA[ 不解析的内容 ]]>
比如我们在xml中输入><都需要转义,特别的麻烦,这个时候就可以用<![CDATA[ ]]>包含在CDATA中的都是不解析的内容,不用再转义了
XML命名规则
- 名称可以包含字母,数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母xml开始
- 名称不能包含空格
上面的命名规则可以让XML是一个”形式良好的“XML
但是它还不是合法的XML,这个时候要怎么办呢?
通过验证,对没错就是验证
XML验证DTD
对外部DTD的引用
<!DOCTYPE 根目录 SYSTEM "DTD 文件路径">
内部DTD
<?xml version="1.0" encoding="UTF-8"?> <!-- 此文档是note类型--> <!DOCTYPE note[ <!-- note元素有三个子元素--> <!ELEMENT note(to,from,body)> <!--to元素为#PCDATA类型--> <!ELEMENT to (#PCDATA)> <!--from 元素为#PCDATA类型--> <!ELEMENT from (#PCDATA)> <!--body 元素为#PCDATA类型--> <!ELEMENT body (#PCDATA)> ]>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books[ <!--books有四个子元素--> <!ELEMENT books (book,price,br,p)> <!ELEMENT book (#PCDATA)> <!ELEMENT price (#PCDATA)> <!--可以为空--> <!ELEMENT br EMPTY> <!--可以为任何值--> <!ELEMENT p ANY> ]> <books> <book>小黑</book> <price>12.0</price> <br/> <p>aa</p> </books>
特别好玩
Schame验证
使用dom技术读写xml
//DocumentBuilder的工厂类,专门用来生成DocumentBuilder DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); //创建一个DocumentBuilder DocumentBuilder builder=dbf.nerDocumentBuilder(); //节解析一个xml得到Docunment对象 Document document=builder.parse("xml路径"); //Document Node Element getElement getElementById :W3c规范里的 Nodelist list=document.getElementByTagName("获取的标签"); //获取的数量 sout(list.getLenght()); //遍历 for(int i=0;i<list.getLenght();i++){ //用Element指向元素 Element elm=(Element)list.item(i); //获取属性 String id=list.getAttribute("属性"); if(id.equals("id")){ //获取第一个子元素是text类型 sout(elm.getFirstChild().getNodeValue()); } }
使用xPath
//DocumentBuilder的工厂类,专门用来生成DocumentBuilder DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); //创建一个DocumentBuilder DocumentBuilder builder=dbf.nerDocumentBuilder(); //节解析一个xml得到Docunment对象 Document document=builder.parse("xml路径"); //创建xpath XPathFactory xPathFactory=XPathFactory.newInstanse(); XPath xpath=xPathFactory.newXPath(); //写xpath语法 XPathExpression exprssion =xpath.compile("//这里和jq选择器像//text()"); //document:对那个document进行提取 XPathConstans.NODE:期望的返回类型 Object o=exprssion.evaluate(document,XPathConstants.NODE); Node node=(Node)o; sout(node.getNodeValue());
写XML
//首先创建Document对象 DocementBuilderFactory dbf=DocumentBuilderFactory.newDefaultInstance(); DocumentBuilder db=dbf.nerDocumentBuilder(); Document document=db.newDocument(); //创建新标签 Element book=docuemnt.createElement("book"); Element name=document.createElement("name"); //添加内容 name.setTextContent("这是一本能变白的书"); //设置层级关系 book.appendChild(name); document.appendChild(book); //接下来是写入,先创建写入的对象 TransformerFactory tr=TranformerFactory.newDefaultInstance(); Transformer transform=tr.newTransformer(); //创建数据源 DOMSource xmlsource=new DOMSource(document); //创建输出地址 FileOutputStream out=new FileOutputStream("地址"); StreamResult fos=new StreamResult(out); //简单设置一下编码格式 transform.setOutputProperty(OutputKeys.ENCODING,"utf-8"); transform.setOutputProperty(OutputKeys.INDENT,"yes"); //这个需要两个参数 一个是来源 一个是目标 transform.transform(xmlSourse,fos); out.close();
dom4j读写
//使用dom4jAPI SAXReader saxResult=new SAXReader(); //read()需要一个文件 Document document = saxResult.read(new File("java/src/XML/x01.xml")); //获取根节点 Element rootElement = document.getRootElement(); System.out.println(rootElement); //获取所有子节点 Iterator<Element> elementIterator = rootElement.elementIterator(); //获取单个的子节点 Element type = rootElement.element("Brand"); Element type1 = type.element("Type"); System.out.println(type); System.out.println(type1); //获取具体的属性值 Attribute name = type.attribute("name"); Attribute id = type1.attribute("id"); System.out.println(name.getValue()+id.getValue()); //dom4j写入 //创建document对象 Document comment = DocumentHelper.createDocument(); //创建元素的时候关联层次关系就确定了 Element book = comment.addElement("book"); Element name1 = book.addElement("name"); //设置文本内容 name1.addText("这是一本书"); //输出 OutputFormat outputFormat=OutputFormat.createPrettyPrint(); outputFormat.setEncoding(StandardCharsets.UTF_8.name()); XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("E:\\zm\\mas.xml"),outputFormat); //把document对象写入 xmlWriter.write(comment);