1.DOM操作
最常用的一种xml解析方式。
xml基本的结点类型:
1.Document 代表整个xml文档。
2.Element 最主要的处理对象。
3.Node DOM基本的数据类型。
4.Attr 元素的属性
5.Text Element或者Attr的实际内容
基本结构如下:
存储:
调用:
3.JSON操作 xml文件虽然规范了文件传输定义格式,但是传输数据时会传递许多无用的数据。JSON是一种轻量级的数据交换格式。 其数据格式大多以JSON对象和JSON数组构成。分别使用JSONObject和JSONArray两个类操作。 JSON对象:包含在"{ }"中,对象的么一个item都是由键值对表示。键值对之间以","隔开。key只能是String类型,value可以是String,number,boolean,null,Object以及Array数组,即可以嵌套。 JSON数组:包含在"[ ]"中,数组中的每一个元素类型都可以是String,number,boolean,null,Object类型。元素之间以","隔开。
<Element>
<Node>
<Element>...</Element>
</Node>
<Element>
</Element>
.
.
.
</Element>
解析:
InputStream inputStream = null; //可以通过文件,网络扒的数据实例化
//创建Document
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = null;
Document document = null;
try {
documentBuilder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
try {
document = documentBuilder.parse(inputStream);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//返回文档的根(root)元素
Element rootElement = document.getDocumentElement();
//获取一个Node集合
NodeList nodes = rootElement.getElementsByTagName("Node名字");
for (int i = 0;i <nodes.getLength();i ++){
Node childNode = nodes.item(i);
//判断子Note的类型为元素Note
if(childNode.getNodeType() == Node.ELEMENT_NODE){
Element element = (Element) childNode;
if ("目标节点名字".equals(element.getNodeName())){
//获取节点具体内容
String text = element.getFirstChild().getNodeName();
}
}
}
存储:
File file = new File(Environment.getExternalStorageDirectory().toString()
+File.separator
+"文件夹名"
+File.separator
+"文件名");
//创建Document
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = null;
Document document = null;
try {
documentBuilder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
document = documentBuilder.newDocument();
//建立各个操作结点
Element element_1 = document.createElement("element_1名字");
Element element_2 = document.createElement("element_2名字");
//设置结点内容
element_1.appendChild(document.createTextNode("内容"));
element_2.appendChild(document.createTextNode("内容"));
//设置结点关系
element_1.appendChild(element_2); //element_2为element_1的子节点
//文档上保存根结点
document.appendChild(element_1);
//输出文档到文件中
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = null;
try {
transformer = transformerFactory.newTransformer();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
}
transformer.setOutputProperty(OutputKeys.ENCODING,"GBK"); //设置编码
//输出文档
DOMSource domSource = new DOMSource(document);
//输出指定位置
StreamResult streamResult = new StreamResult(file);
//输出
try {
transformer.transform(domSource,streamResult);
} catch (TransformerException e) {
e.printStackTrace();
}
2.SAX操作
相比而言,DOM操作并不适合进行大数据文件的操作,SAX可能更方便。
要完成SAX解析,首先必须定义一个SAX解析器:
/**
* 存储SAX解析得到的数据
* */
public class DataFromSAX{
//定义相关字段存储信息
//定义getXXX(),setXXX()方法
}
public class MySAX extends DefaultHandler{
private List<DataFromSAX> dataFromSAXList = null;
private DataFromSAX dataFromSAX = null;
private String currentElement = null; //保存元素名称
/**
* 文档开始
* */
@Override
public void startDocument() throws SAXException {
super.startDocument();
dataFromSAXList = new ArrayList<>();
}
/**
* 元素开始
* */
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if ("目标结点(元素)名".equals(localName)){
dataFromSAX = new DataFromSAX();
}
currentElement = localName;
}
/**
* 取得元素内容
* */
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
if (currentElement != null){ //当前有元素
String data = new String(ch,start,length); //记录文字信息
if ("目标名".equals(currentElement)){
//dataFromSAX.setXXX(data);
}
}
}
/**
* 元素结束
* */
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if ("目标结点(元素)名".equals(localName)){
dataFromSAXList.add(dataFromSAX);
dataFromSAX = null; //清空对象
}
currentElement = null; //清空元素标记
}
//取得全部数据集合
public List<DataFromSAX> getList(){
return dataFromSAXList;
}
}
调用:
//建立SAX解析工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//构造解析器
SAXParser saxParser = null;
MySAX mySAX = new MySAX();
try {
saxParser = saxParserFactory.newSAXParser();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
try {
saxParser.parse(参数1:文件或者流,saxParser);
} catch (Exception e) {
e.printStackTrace();
}
List<DataFromSAX> list = mySAX.getList();
//通过list来更新UI
}
3.JSON操作 xml文件虽然规范了文件传输定义格式,但是传输数据时会传递许多无用的数据。JSON是一种轻量级的数据交换格式。 其数据格式大多以JSON对象和JSON数组构成。分别使用JSONObject和JSONArray两个类操作。 JSON对象:包含在"{ }"中,对象的么一个item都是由键值对表示。键值对之间以","隔开。key只能是String类型,value可以是String,number,boolean,null,Object以及Array数组,即可以嵌套。 JSON数组:包含在"[ ]"中,数组中的每一个元素类型都可以是String,number,boolean,null,Object类型。元素之间以","隔开。
{"key1":value1,"key2":value2}
value常用类型:
String:表示形式:"存储内容"
Array:表示形式(多嵌套):[{键:值},{}]
解析时首先分析数据类型,然后确定采用哪种解析技术。有两种技术可选:android内置json包和google开源gson库。
解析:
private List<Map<String,Object>> parseJSON(String data){
List<Map<String,Object>> list = new ArrayList<>();
JSONArray jsonArray = null;
try {
jsonArray = new JSONArray(data);
} catch (JSONException e) {
e.printStackTrace();
}
for (int i = 0;i < jsonArray.length();i ++){
Map<String,Object> map = new HashMap<>();
JSONObject jsonObject = null;
try {
jsonObject = jsonArray.getJSONObject(i);
} catch (JSONException e) {
e.printStackTrace();
}
//map形式保存数据
//map.put("...",jsonObject.getXXX("..."));
list.add(map);
}
return list;
}
存储:
private void restoreJSON(String[] data){
//根Object
JSONObject jsonObject = new JSONObject();
//Object包含Array
JSONArray jsonArray = new JSONArray();
for (int i = 0;i < data.length;i ++){
//Array包含Object
JSONObject object = new JSONObject();
try {
object.put("...",data[i]);
} catch (JSONException e) {
e.printStackTrace();
}
//Array添加object
jsonArray.put(object);
}
try {
//根Object添加Array
jsonObject.put("...",jsonArray);
} catch (JSONException e) {
e.printStackTrace();
}
File file = new File(Environment.getExternalStorageDirectory().toString()
+File.separator
+"文件夹名"
+File.separator
+"文件名");
if (! file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
PrintStream printStream = null;
try {
printStream = new PrintStream(new FileOutputStream(file));
printStream.print(jsonObject.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (printStream != null){
printStream.close(); //关闭打印流
}
}
}