XML
1.XML介绍
XML 可扩展标记语言(eXtensible Markup Language)没有预定义任何标签,需要自行定义标签
XML的特点 与操作系统 编程语言无关 可实现不同系统之间数据交换
XML作用 数据存储 数据交换 数据配置
2.XML和HTML的区别
XML 不是 HTML 的替代。
XML 和 HTML 为不同的目的而设计:
- XML 被设计用来传输和存储数据,其焦点是数据的内容。
- HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
3.XML语法
<标签名 属性名="属性值" 属性名="属性值" > 标签内容[空内容,其他标签,文本] </标签名>
元素的命名规则如下:
名称中可以包含字母、数字或者其他的字符
名称不能以数字或者标点符号开始
名称不能以字符“xml”(或者XML、Xml)开始
名称中不能含空格
属性的语法规则如下:
属性可以加在任何一个元素的起始标签上,但不能加在结束标签上
属性值用双引号包裹
一个元素可以有多个属性,多个属性之间用空格隔开
属性值中不能直接包含 <、"、&
特殊符号处理:
方式1: 特殊代码
< <
> >
" "
' '
& &
方式2: 将内容声明普通文本
<description>
<![CDATA[ 讲解了元素<title>以及</title>的使用 ]]>
</description>
要求:
格式良好的XML文档需要遵循如下规则
1.有XML声明语句: <?xml version="1.0" encoding="UTF-8/[gb2312]"?>
2.有且仅有一个根元素: 根标签需要包裹整个文件内容.
3.标签大小写敏感: <A> <a> [HTML中,大小写不区分]
4.属性值用双引号/单引号: <a href="sdsds"></a> <a href='sdsds'></a>
5:标签成对/空标签关闭: 标签必须有开始和结束. <标签名/> 或 <标签名></标签名>
6.元素正确嵌套
4.XML解析四种方式
DOM
SAX
JDOM
DOM4j
5.DOM解析XML
<?xml version="1.0" encoding="utf-8" ?> <PhoneInfo> <Brand name="华为"> <Type name="P90"></Type> </Brand> <Brand name="苹果"> <Type name="iPhone Z"/> <Type name="iPhone ZL"/> </Brand> </PhoneInfo>
public class TestDOM { public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException { //1.DOM解析工厂实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //2.DOM解析器 DocumentBuilder builder = factory.newDocumentBuilder(); //3.构建DOM对象 Document document = builder.parse("W:\StudyWorkSpace\TestXML\src\phone.xml "); //4.操作DOM对象 解析xml //getElementsByTagName() 指定名称下的所有标签 //getLength() 标签的个数 //item() 指定位置的标签 //getAttribute() 指定属性值 NodeList nodeList = document.getElementsByTagName("Brand"); for (int i = 0; i < nodeList.getLength(); i++) { Element brand = (Element) nodeList.item(i); String name = brand.getAttribute("name"); System.out.println("name = " + name ); NodeList types = brand.getElementsByTagName("Type"); for (int j = 0; j < types.getLength(); j++) { String typeName =((Element) types.item(j)).getAttribute("name"); System.out.println("typeName = " + typeName); } } } }
DOM CRUD XML文件
<?xml version="1.0" encoding="utf-8" ?> <PhoneInfo> <Brand name="华为"> <Type name="P90"></Type> </Brand> <Brand name="苹果"> <Type name="iPhone Z"/> <Type name="iPhone ZL"/> </Brand> </PhoneInfo>
ublic class TestNewCRUD { public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException, TransformerException { //1.DOM解析工厂实例 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); //2.DOM解析器 DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder(); //3.DOM对象 Document document = documentBuilder.parse("W:\StudyWorkSpace\TestXML\src\newPhone.xml"); //4.操作DOM对象 添加节点 修改节点 删除节点 保存xml //添加节点 Element newBrand = document.createElement("Brand"); newBrand.setAttribute("name","三星"); Element newType = document.createElement("Type"); newType.setAttribute("name","s111"); //建立父子节点关系 newBrand.appendChild(newType); //添加到整个文档对象中 document.getElementsByTagName("PhoneInfo").item(0).appendChild(newBrand); //修改节点 Element element = (Element) document.getElementsByTagName("Brand").item(2); element.setAttribute("name" ,"SAMSUNG"); //删除节点 Element elementDel = (Element) document.getElementsByTagName("Brand").item(2); //获得父节点在删除子节点 Node parentNode = element.getParentNode(); parentNode.removeChild(elementDel); //保存xml //创建DOM源 内存 DOMSource domSource = new DOMSource(document); //创建流 写入磁盘 StreamResult result = new StreamResult(new FileOutputStream("newPhone01.xml")); //设置文件格式 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.VERSION,"1.0"); transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8"); transformer.setOutputProperty(OutputKeys.INDENT,"yes"); transformer.setOutputProperty(OutputKeys.STANDALONE, "yes"); transformer.transform(domSource,result); } }
6.DOM4J解析XML
public class TestDOM4J { public static void main(String[] args) throws DocumentException, IOException { //1.创建SAXReader对象 SAXReader reader = new SAXReader(); //2.解析xml文件 获得Document对象 Document document = reader.read(new File("W:\StudyWorkSpace\TestXML\src\newPhone.xml")); //DOM4J SAXReader 边读边解析 从根标签开始 Element rootElement = document.getRootElement(); //打印整个文件内容 System.out.println(document.asXML()); List<Element> list = rootElement.elements("Brand"); //读取: 属性,文本 List<Element> allBrand=rootElement.elements("Brand"); for (Element element : allBrand) { //操作属性 //element.attribute("name").getValue(); String name=element.attributeValue("name"); //操作子标签 List<Element> typeList=element.elements("Type"); for (Element typeE : typeList) { String typeName=typeE.attributeValue("name"); System.out.println(name+"-"+typeName); } } //添加 Element newBrand = rootElement.addElement("Brand"); newBrand.addAttribute("name" ,"sanxing"); Element newType = newBrand.addElement("Type"); newType.addAttribute("name","yyyy"); //修改 newBrand.setAttributeValue("name","三星"); //删除 rootElement.remove(newBrand); //保存 OutputFormat out = OutputFormat.createPrettyPrint(); out.setEncoding("UTF-8"); XMLWriter writer = new XMLWriter(new FileOutputStream("新手机.xml"), out); writer.write(document); writer.close(); } }