day3.29总结_XML_DOM解析

一、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)特殊字符的处理(&lt;&gt;..........)

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;

       }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值