一、XML 编写(了解)
1)XML 是什么?(why)
Xml是一种可扩展标记语言,是W3C的标准。
2)XML 应用场合? (when)
1)定义配置文件,描述数据。
2)做为一种数据传输格式封装数据。(C/S)
3)为什么使用XML? (Why)
1)它是w3c(万维网)的一个标准。
2)能更好的描述数据。
4)XML 的构成及编写?(How)
1)xml 声明(注释空格)
2)xml 元素(只有一个根元素)
3)xml 注释:<!--注释内容-->
术语说明:
1)标签:以"<>"括起来的内容
2)元素:开始标签,结束标签以及其中的内容。
编写注意:
1)标签名严格区分大小写。
2)标签必须正确嵌套
3)标签名应该有意义
4)特殊字符的处理(<>..........)
5)CDATA区(<![CDATA[内容]]>)
5)XML 的相关约束?(了解)
1.DTD 约束(简单,容易编写)
2.Schema约束 (以xml约束xml,编写相对困难)
说明:了解DTD编写的基本语法就可以了
例子:
book.xml |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE book PUBLIC "//UNKNOWN/" "book.dtd"> <book> <name>水浒传</name> <author>施耐庵</author> <price>56</price> </book> |
book.dtd |
<!ELEMENT book (name+,author,price)> |
二、XML 解析
1)XML DOM 解析概述
所谓dom解析是将整个xml文档读到内存,在内存构建一颗倒置的节点(Node)树,然后再从这颗树中提取我们需要的数据。
dom解析是w3c的一个标准,是常用解析方案之一。
适用于一些比较小的xml文档的解析。
2)XML DOM 解析步骤
1)构建解析器对象(DocumentBuilder)
2)解析xml文件获得document对象
3)处理数据(一般从根元素开始)
例子1(常规)
//1.创建解析器对象 DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocumentBuilder(); //2.解析文件//(代表内存中的文档树) Document doc=builder.parse(new File("src/day19/layout01.xml")); //3.处理数据 //3.1获得文档的根元素 Element root=doc.getDocumentElement(); //3.2获得根元素中的子元素 NodeList list=root.getChildNodes(); for(int i=0;i<list.getLength();i++){ //每一个子元素 Node node=list.item(i); //判断是否为ELEMENT元素 if(node.getNodeType()==Node.ELEMENT_NODE){ nodeAttr(node); } } } /**获得node节点的属性*/ static void nodeAttr(Node node){ //获得node节点的所有属性 NamedNodeMap attrs =node.getAttributes(); //遍历node所有的属性节点 for(int i=0;i<attrs.getLength();i++){ //获得某个属性 Node n=attrs.item(i); //输出属性名字和值 System.out.println(n.getNodeName()+"="+n.getNodeValue()); System.out.println(n.getNodeName()+"="+n.getTextContent());(获取文本用这个) } } |
layout01.xml |
<?xml version="1.0" encoding="UTF-8"?> <Linearlayout> <TextView text="textview01"/> <Button text2="button01"/> </Linearlayout> |
例子2(解析一个字符串)
static String bookStr= "<books>" + "<book><id>101</id><name>android</name></book>" + "<book><id>102</id><name>ios</name></book>" + "</books>"; static List<Map<String,String>> list=new ArrayList<>(); public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { //1.构建解析器对象 DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocumentBuilder(); //2.解析字符串 Document doc= 创建document的两种方式 //parse(InputStream is) //builder.parse(new ByteArrayInputStream(bookStr.getBytes())); //parse(InputSource is) builder.parse(new InputSource(new StringReader(bookStr))); //3.处理数据 //Element root=doc.getDocumentElement(); //System.out.println(root.getFirstChild().getFirstChild().getNextSibling().getTextContent()); processData(doc);
} static void processData(Document doc){ //获得根元素 Element root=doc.getDocumentElement(); //遍历子元素 NodeList list=root.getChildNodes();//book for(int i=0;i<list.getLength();i++){ //一个book节点对应一个map对象 Node node=list.item(i);//book //将node节点中的数据封装到map,然后添加到list. XMLDom02.list.add(loadMap(node)); } System.out.println(XMLDom02.list); } static Map<String,String> loadMap(Node node){ Map<String,String> map=new HashMap<String, String>(); //获得book元素下的子节点 NodeList childs=node.getChildNodes(); //遍历book元素下的子节点 for(int j=0;j<childs.getLength();j++){ Node n=childs.item(j); if(n.getNodeType()==Node.ELEMENT_NODE){ //map.put(n.getNodeName(),n.getTextContent());获取标签的值的两种方式 map.put(n.getNodeName(),n.getFirstChild().getNodeValue()); } } return map; } |
例子3(将 XML Source 转换为 Result)
DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocumentBuilder(); //创建新的document Document doc=builder.newDocument(); //创建一个元素节点 Element root=doc.createElement("note");//tagName //创建一个文本节点 Text text=doc.createTextNode("helloworld"); //note元素中追加一个文本节点 root.appendChild(text); //将note节点添加到document中 doc.appendChild(root); //<note>helloworld</note> Transformer tf=TransformerFactory.newInstance().newTransformer();
// Transformer 是否可以添加额外的空白;其值必须为 yes 或 no。 tf.setOutputProperty(OutputKeys.INDENT,"yes");
//transform(Source xmlSource, Result outputTarget) //将 XML Source 转换为 Result tf.transform(new DOMSource(doc),new StreamResult(new File("x1.xml"))); //输出到控制台 tf.transform(new DOMSource(doc),new StreamResult(System.out)); |
例子4(追加一个子节点)
//创建DocumentBuilder对象 DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocumentBuilder(); //创建新的document Document doc=builder.parse(new InputSource(new StringReader(s))); //创建一个元素节点 Element root=doc.createElement("note");//tagName //创建一个文本节点 Text text=doc.createTextNode("helloworld"); //note元素中追加一个文本节点 root.appendChild(text); doc.getDocumentElement().appendChild(root); //<note>helloworld</note> //将doc对象转换为xml文档输出 Transformer tf=TransformerFactory.newInstance().newTransformer(); //设置输出特性 tf.setOutputProperty(OutputKeys.INDENT,"yes");//缩进 tf.transform(new DOMSource(doc),new StreamResult(System.out)); |
案例(考试试题与选项)
package com.example.day19_homework;
public class MainActivity extends Activity {
String questionStr= "<question>" + "<title>static 描述错误的是:</title>" + "<option>可以修饰外部类</option>"+ "<option>可以修饰属性</option>"+ "<option>可以修饰方法</option>"+ "<option>可以修饰代码块</option>"+ "</question>"; //创建一个Map Map<String,Object> map =new HashMap<String,Object>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { parseString(questionStr); } catch (Exception e) { Toast.makeText(this, "解析失败", 1); return; }
//获取界面的标签 TextView titleTv = (TextView) findViewById(R.id.textView1); TextView optionTv = (TextView) findViewById(R.id.textView2);
//设置标题 titleTv.setText((String) map.get("title")); //清空选项 optionTv.setText(""); //获取选项的集合 List<String> options = (List<String>) map.get("options"); //遍历 //定义一个字符 char c = 'A'; for (int i = 0; i < options.size(); i++) { String option = options.get(i); //设置选项 optionTv.append(c+":"+option+"\n"); c++; } } private void parseString(String questionStr) throws Exception { //创建一个builder对象 DocumentBuilder builder =DocumentBuilderFactory.newInstance().newDocumentBuilder(); //创建一个Document对象 Document doc = builder.parse(new InputSource(new StringReader(questionStr))); //获取title的文本 String title = doc.getElementsByTagName("title").item(0).getTextContent(); //添加到Map map.put("title", title);
//创建一个list来放option List<String> options =new ArrayList<String>(); //获取 NodeList optionNodes = doc.getElementsByTagName("option"); //遍历 for (int i = 0; i < optionNodes.getLength(); i++) { //获取选项的文本 String option = optionNodes.item(i).getTextContent(); //添加到list options.add(option); } //list添加Map map.put("options", options); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } |