XML解析概述

什么是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;<
&gt;>
&amp;

&

&apos;

'

&quot;"

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胖子敲代 码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值