XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
我们没有XML这种语言之前,我们使用的是String作为两个程序之间的通讯!现在问题就来了,如果我们传输的是带有关系型结构的数据,String怎么表达呢?String对关系型数据不擅长,要是描述起来也难免会有歧义的时候!
HTML语言本身就有缺陷:
标记都是固定的,不能自定义。HTML语言中有什么标记就只能用什么标记
HTML标签本身就缺少含义 (tr标签里面什么内容都能放进去,不规范!)
HTML没有实现真正的国际化
①:配置文件(例子:Tomcat的web.xml,server.xml……),XML能够非常清晰描述出程序之间的关系
②:程序间数据的传输,XML的格式是通用的,能够减少交换数据时的复杂性!
③:充当小型数据库,如果我们的数据有时候需要人工配置的,那么XML充当小型的数据库是个不错的选择,程序直接读取XML文件显然要比读取数据库要快呢!
XML被设计为“什么都不做”,XML数据或XML文档只用于组织、存储数据,除此之外的数据生成、读取、传送、存取等等操作都与XML本身无关!
于是乎,想要操作XML,就需要用到XML之外的技术了:
为XML定规则:现在一般使用DTD或Schema技术,当然了Schema技术更为先进!
解析XML的数据:一般使用DOM或者SAX技术,各有各的优点
提供样式:XML一般用来存储数据的,但设计者野心很大,也想用来显示数据(但没人用XML来显示数据),就有了XSLT(eXtensiable Stylesheet Language Transformation)可扩展样式转换语言
XML声明放在XML的第一行
version —— 版本
encoding —— 编码
standalone–独立使用 —— 默认是no。standalone表示该xml是不是独立的。
如果是yes,则表示这个XML文档时独立的,不能引用外部的DTD规范文件;
如果是no,则该XML文档不是独立的,表示可以引用外部的DTD规范文档。
正确的文档声明格式,属性的位置不能改变!
<?xml version="1.0" encoding="utf-8" standalone="no"?>
元素中需要值得注意的地方:
XML元素中的出现的空格和换行都会被当做元素内容进行处理
每个XML文档必须有且只有一个根元素
元素必须闭合
大小写敏感
不能交叉嵌套
不能以数字开头
XML的语法是规范的!不要随意乱写!
属性是作为XML元素中的一部分的,命名规范也是和XML元素一样的!
<china name="chinese">china>
在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。
遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。
对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。
①:dom (Document Object Model) :文档对象模型,是W3C组织推荐解析XML的一种方式。
②:sax (Simple API For XML):它是XML社区的标准,几乎所有XML解析器都支持它!
应用程序不是直接对XML文档进行操作的,而是由XML解析器对XML文档进行分析,然后应用程序通过XML解析器所提供的DOM接口或者SAX接口对分析结果进行操作,从而间接地实现了对XML文档的访问!
xml文档中的数据
<?xml version="1.0" encoding="utf-8" standalone="no"?><china><guangzhou >广州guangzhou><shenzhen>深圳shenzhen><beijing>北京beijing><shanghai>上海shanghai>china>
public class Main{public static void main(String[] args) throws ParserConfigurationException , IOException, SAXException {//API规范:需要用一个工厂来造解析器对象,先造了一个工厂DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();//获取解析器对象DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();//解析XML文档,得到了代表XML文档的Document对象!Document document = documentBuilder.parse(new File("test.xml"));list(document);}private static void list(Node node){if(node.getNodeType() == Node.ELEMENT_NODE){ System.out.println(node.getNodeName());}NodeList nodelist = node.getChildNodes();for(int i = 0;i<nodelist.getLength();i++){Node child = nodelist.item(i);list(child);}}}/*Output:chinaguangzhoushenzhenbeijingshanghai */
private static void read(Document document){NodeList nodelist = document.getElementsByTagName("a");Node node = nodelist.item(0);String value = node.getTextContent(); System.out.println(value);}/*Output:广州 */
增加到XML文档中的最后
private static void add(Document document) throws TransformerException {//创建需要增加的节点 Element element = document.createElement("hangzhou");//向节点添加文本内容 element.setTextContent("杭州");//得到需要添加节点的父节点 Node parent = document.getElementsByTagName("china").item(0);//把需要增加的节点挂在父节点下面去 parent.appendChild(element);//获取一个转换器它需要工厂来造,那么我就造一个工厂 TransformerFactory transformerFactory = TransformerFactory.newInstance();//获取转换器对象 Transformer transformer = transformerFactory.newTransformer();//把内存中的Dom树更新到硬盘中 transformer.transform(new DOMSource(document),new StreamResult("test.xml"));}
增加到指定节点的前一个
private static void add2(Document document) throws TransformerException {//获取到beijing节点 Node beijing = document.getElementsByTagName("beijing").item(0);//创建新的节点 Element element = document.createElement("guangxi");//设置节点的文本内容 element.setTextContent("广西");//获取到要创建节点的父节点, Node parent = document.getElementsByTagName("china").item(0);//将guangxi节点插入到beijing节点之前! parent.insertBefore(element, beijing);//将内存中的Dom树更新到硬盘文件中 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult("city.xml"));}
private static void delete(Document document) throws TransformerException {//获取到beijing这个节点 Node node = document.getElementsByTagName("beijing").item(0);//获取到父节点,然后通过父节点把自己删除了 node.getParentNode().removeChild(node);//把内存中的Dom树更新到硬盘文件中 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document),new StreamResult("test.xml"));}
private static void updata(Document document) throws TransformerException {//获取到广州的结点 Node node = document.getElementsByTagName("guangzhou").item(0); node.setTextContent("广州你好");//将内存中的Dom树更新到硬盘文件中 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document),new StreamResult("test.xml"));}
7.1.6 操作属性
private static void updataAttribute(Document document) throws TransformerException {//获取到guangzhou节点 Node node = document.getElementsByTagName("guangzhou").item(0);//现在node节点没有增加属性的方法,所以我就要找它的子类---Element Element guangzhou = (Element) node; guangzhou.setAttribute("play","gzchanglong");//如果要删除属性就用removeAttribute()方法//将内存中的Dom树更新到硬盘文件中 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document),new StreamResult("test.xml"));}
需要导入开发包
dom缺点:比较耗费内存
sax缺点:只能对xml文件进行读取,不能修改,添加,删除
dom4j:既可以提高效率,同时也可以进行crud操作
①:读取XML文件,获得document对象(这种最常用)
SAXReader reader = new SAXReader();Document document = reader.read(new File("input.xml"));
②:解析XML形式的文本,得到document对象
String text = "";Document document=DocumentHelper.parseText(text);
③:主动创建document对象.
Document document =DocumentHelper.createDocument();//创建根节点Element root = document.addElement("members");
XML文件
<?xml version="1.0" encoding="UTF-8" ?><person><name littleName="zk">xzkname><age>20age>person>
一般查询
public void read() throws DocumentException {//获取到解析器 SAXReader saxReader = new SAXReader();//获取到XML文件的流对象 InputStream inputStream = dom4j11.class.getClassLoader().getResourceAsStream("1.xml");//通过解析器读取XML文件 Document document = saxReader.read(inputStream);//获取得到根节点 Element root = document.getRootElement();//获取得到name节点 Element name = root.element("name");//得到了name节点,就可以获取name节点的属性或者文本内容了! String text = name.getText(); String attribute = name.attributeValue("littleName"); System.out.println("文本内容是:" + text); System.out.println("属性内容是:" + attribute);}/*Output:文本内容是:xzk属性内容是:zk */
多层结构的查询
//获取得到根节点Element root = document.getRootElement();//一层一层地获取到节点Element element = root.element("guangdong").element("guangzhou").element("luogang");String value = element.getText();System.out.println(value);
public void add() throws Exception {//获取到解析器 SAXReader saxReader = new SAXReader();//获取到XML文件的流对象 InputStream inputStream = dom4j11.class.getClassLoader().getResourceAsStream("1.xml");//通过解析器读取XML文件 Document document = saxReader.read(inputStream);//创建出新的节点,为节点设置文本内容 Element newElement = DocumentHelper.createElement("name"); newElement.setText("ouzicheng");//获取到根元素 Element root = document.getRootElement();//把新创建的name节点挂在根节点下面 root.add(newElement);//创建带有格式的对象 OutputFormat outputFormat = OutputFormat.createPrettyPrint();//设置编码,默认的编码是gb2312,读写的编码不一致,会导致乱码的! outputFormat.setEncoding("UTF-8");//创建XMLWriter对象 XMLWriter xmlWriter = new XMLWriter(new FileWriter("2.xml"), outputFormat);//XMLWriter对象写入的是document xmlWriter.write(document);//关闭流 xmlWriter.close();}
在指定的位置增加节点
//创建一个新节点Element element = DocumentHelper.createElement("name");element.setText("ouzciheng");//获取得到person下所有的节点元素!List list = document.getRootElement().elements();//将节点添加到指定的位置上list.add(1, element);
//获取得到age元素Element age = document.getRootElement().element("age");age.setText("9999");
XMLWriter和获取Document对象的代码和前面的都是一样的
//获取得到age节点Element age = document.getRootElement().element("age");//得到age节点的父节点,使用父节点的remove删除age节点!age.getParent().remove(age);
XMLWriter和获取Document对象的代码和前面的都是一样的
感谢你看到这里,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!
相关知识
用户登录界面设计代码html
在学习压力大时,我通常通过做运动来放松自己,因为做它要花 的翻译是:When stressed, I usually exercise to relax, do it because you want to spend 中文翻译英文意思,翻译英语
Evaluation of insect pollination and service value in China's agricultural ecosystems
毕设
..::岳小花:绿色电力证书的法律属性、制度功能与规范完善
唤醒自然的属性——切尔西花展之园艺疗法花园
页游凡人修真2花小童宠物获得属性详解
端午节礼显示企业福利定制化趋势 京东企业业务推出礼品定制解决方案
花呗发短信显示什么内容?
调查显示玫瑰花占俄罗斯进口花卉的46%
网址: xml 属性value换行显示 https://m.huajiangbk.com/newsview56333.html
上一篇: 灯具藏家:花30年时间收藏100 |
下一篇: 收藏!多种原因导致的花皮果,可以 |