DOM操作
2016-03-07 17:09
447 查看
使用文件保存数据时,往往会采用XML文件形式进行数据的保存,一旦使用了XML操作,就需要对XML文件进行解析,今天先来解释下常用的一种解析:DOM解析。
一、DOM解析是将XML文件全部载入,组装成一颗DOM树,然后通过节点以及节点之间的关系来解析XML文件。
1:要读入一个XML文档,首先要有一个DocumentBuilder对象:
2:现在可以从文件中去读取一个XML文件了
得到XML文件有三种方式:
1:通过文件方式读取:
2:通过一个URL方式读取:
3:可以能过java IO 流的读取:
二、通过程序输出XML文件
首先是我们的布局文件
接下来我们来看看java程序,在改程序中,我队一些类和方法进行了注释
最后修改AndroidManifest.xml
到此我们的关于DOM解析就完成了。
一、DOM解析是将XML文件全部载入,组装成一颗DOM树,然后通过节点以及节点之间的关系来解析XML文件。
1:要读入一个XML文档,首先要有一个DocumentBuilder对象:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder();
2:现在可以从文件中去读取一个XML文件了
得到XML文件有三种方式:
1:通过文件方式读取:
File file=new File("F:""menber.xml"); Document doc=builder.parse(file);
2:通过一个URL方式读取:
URL u=new URL("http://java.sun.com/index.html") Document doc=builder.parse(u);
3:可以能过java IO 流的读取:
FileInputStream is = new FileInputStream( "F:""member.xml"); Document doc=builder.parse(is);
二、通过程序输出XML文件
首先是我们的布局文件
<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TableRow> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20px" android:text="姓名:"/> <EditText android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content"/> </TableRow> <TableRow> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20px" android:text="邮箱:"/> <EditText android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content"/> </TableRow> <TableRow> <Button android:id="@+id/but" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="保存"/> </TableRow> </TableLayout>
<span style="font-size:18px;">用户可以在界面输入姓名和邮箱:</span>
接下来我们来看看java程序,在改程序中,我队一些类和方法进行了注释
package com.administrator.dom; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import org.w3c.dom.Document; import org.w3c.dom.Element; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; public class MainActivity extends AppCompatActivity { private TextView name; private TextView email; private Button save; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); name= (TextView) findViewById(R.id.name); email= (TextView) findViewById(R.id.email); save= (Button) findViewById(R.id.but); save.setOnClickListener(new OnClickListenerImpl()); } private class OnClickListenerImpl implements View.OnClickListener { @Override //1.MEDIA_MOUNTED:SD卡正常挂载 //2.Environment.getExternalStorageDirectory()获取外部存储路径(这里我想要说下,我有在网上 // 看到朋友们说,除了SD卡以外,还会出现存储到手机内部存储中!!表示我还没有遇到这种情况······) //3.File.separator这个其实就是代表了“\”符号 public void onClick(View v) { if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ return; } File file=new File(Environment.getExternalStorageDirectory().toString() +File.separator +"zsfdata"+File.separator+"member.xml"); //4.file.getParentFile()返回此抽象路径名的父抽象路径名 //5.mkdirs() 创建此抽象路径名,包括必要的和不存在的父目录的目录。 //mkdirs()可以创建多层目录,如“F:\zz\ss\ff······” //mkdir()只可以创建单层目录,如“F:\zz” if(!file.getParentFile().exists()){ file.getParentFile().mkdirs();//创建文件夹 } //6想要读取文档,必须要有一个DocumentBuilder //建立DocumentBuilderFactory,用以取得DocumentBuilder DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=null; try { builder=factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } //7.定义Document接口对象,通过DocumentBuider类进行DOM树的转换操作 //Document 接口表示整个 HTML 或 XML 文档。从概念上讲,它是文档树的根,并提供对文档数据 // 的基本访问。 Document doc=null; doc=builder.newDocument();//建立一个新文档 //8.建立各个操作节点 //Element,接口。表示一个程序元素,比如包、类或者方法。每个元素都表示一个静态的语言级构造 // (不表示虚拟机的运行时构造)。 //元素应该使用 equals(Object) 方法进行比较。不保证总是使用相同的对象表示某个特定的元素。 // 要实现基于 Element 对象类的操作,可以使用 visitor 或者使用 getKind() 方法的结果。 /** * Element createElement(String tagName)throws DOMException * 创建指定类型的元素。注意,返回的实例实现 Element 接口,所以可以直接在返回的对象上指定属性。 * 此外,如果存在具有默认值的已知属性,则自动创建表示它们的 Attr 节点,并将其连接到该元素。 * 要创建具有限定名称和名称空间 URI 的元素,使用 createElementNS 方法。 */ Element addresslist=doc.createElement("addresslist"); Element linkman=doc.createElement("linkman"); Element name=doc.createElement("name"); Element email=doc.createElement("email"); //9.设置节点的内容,即为每一个节点添加文本节点 //定义和用法 //appendChild() 方法在指定元素节点的最后一个子节点之后添加节点。 //该方法返回新的子节点。 //语法:appendChild(node);参数node,必须要追加的节点 name.appendChild(doc.createTextNode(MainActivity.this.name.getText().toString())); email.appendChild(doc.createTextNode(MainActivity.this.email.getText().toString())); //10.设置节点关系 linkman.appendChild(name); linkman.appendChild(email); addresslist.appendChild(linkman); doc.appendChild(addresslist); /** * TransformerFactory 实例可用于创建 Transformer 和 Templates 对象。 确定要创建的哪一个 Factory 实现被命名为 "javax.xml.transform.TransformerFactory" 的系统属性。此属性命名了 TransformerFactory 抽象类的一个具体子类。如果未定义此属性, 则使用平台默认的属性。 */ /**Transformer类--此抽象类的实例能够将源树转换为结果树。 可以通过 TransformerFactory.newTransformer 方法获取此类的实例。然后可以使用此实例处理 来自不同源的 XML,并将转换输出写入各种接收器。 在多线程同时运行时不能使用此类的对象。不同线程可以同时使用不同的 Transformers。 Transformer 可以多次使用。可以在转换之间保留参数和输出属性。 * */ //11.输出文档到文件中 TransformerFactory tf=TransformerFactory.newInstance(); Transformer t=null; try { t=tf.newTransformer(); } catch (TransformerConfigurationException e) { e.printStackTrace(); } t.setOutputProperty(OutputKeys.ENCODING,"GBK");//设置转换的输出属性。 //DOMSource类 以 Document Object Model(DOM)树的形式充当转换 Source 树的持有者。 DOMSource source=new DOMSource(doc); StreamResult result=new StreamResult(file);//指定输出位置 try { t.transform(source,result); } catch (TransformerException e) { e.printStackTrace(); } } } }
最后修改AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
到此我们的关于DOM解析就完成了。
相关文章推荐
- 数据仓库和数据集市的区别和联系
- java 反射机制详解
- android 6.0 SystemUI源码分析(3)-Recent Panel加载显示流程
- HBase源码分析之compact请求发起时机、判断条件等详情(二)
- NSUserDefault存储对象模型
- free -m
- docker swarm compose
- centos 7 LNMP
- 字符串匹配
- Android 进程间通信(IPC)---AIDL入门
- SQL分页
- Hibernate各种主键生成策略与配置详解
- 实现frame框架窗口间的关联及超链接的target属性的使用
- Linux的下c++的编译运行
- 搭建mongodb热备集群 和 c#驱动
- Light OJ 1234 Harmonic Number
- POJ1050To the Max(求最大子矩阵)
- [转]那些年,会计们必经的“菜鸟”时光
- 知识思考
- 2016 -03 -07 字符串是否包含字符串/字符