1.Dom方式来操作xml。
(1).Dom方式创建xml文件:
private void createXml() throws FileNotFoundException {
OutputStream out = new FileOutputStream(new File(
Environment.getExternalStorageDirectory(), "Domxml1.xml"));
try {
/**
* Dom方式创建或者解析XML不同于Pull方式。
* Dom方式操作XML只有一种方式
* 先实例化一个工厂,通过工厂去实例一个builer
* 再调用builer去创建文件
*/
//创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
//创建一个XML生成器
DocumentBuilder builder = factory.newDocumentBuilder();
//创建文件(xml文件) 可以理解为document就是一个xml文件
Document document = builder.newDocument();
//创建一个info的节点
Element infoElement = document.createElement("info");
//创建一个叫user的节点
Element userElement = document.createElement("user");
//往info节点里面添加user节点,因此info节点是最外层的节点.
//可以理解为因为info节点没有添加到任何节点之中(没有用appendChild
//方法) 所以info节点深处XML文件的最外层或者最顶端
infoElement.appendChild(userElement);
//为user节点去设置属性
userElement.setAttribute("id", "1");
//创建一个叫name的节点
Element nameElement = document.createElement("name");
//name节点追加到user节点里面
userElement.appendChild(nameElement);
//为name节点设置值。也就是<name></name>中间的值
//值也是节点重点一个子元素,不过不同的是值可以自己设定
//而不需要去像创建节点那样去创建值
//调用Document类的CreateTextNode方法去设置值
nameElement.appendChild(document.createTextNode("张三"));
Element ageElement = document.createElement("age");
userElement.appendChild(ageElement);
ageElement.appendChild(document.createTextNode("20"));
Element sexElement = document.createElement("sex");
userElement.appendChild(sexElement);
sexElement.appendChild(document.createTextNode("男"));
//最后不要忘了往XML文件里面去添加最外层节点(info节点)
document.appendChild(infoElement);
//最重要的一点是Dom方式创建xml时,需要用一个转换器去将
//上面写好的内容的document转换为一个xml文本。
//而转换器(Transformer)也需要由一个工厂去创建
//创建转换器工厂(TransformaerFactory)
TransformerFactory transFactory = TransformerFactory.newInstance();
//创建转换器(Transformer)
Transformer transformer = transFactory.newTransformer();
//用转换器转换为XMl文件时给xml文件设置的属性
//例如:<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
//设置版本号
transformer.setOutputProperty(OutputKeys.VERSION, "1.0");
//设置转换过程中的编码
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//设置是否standalone
transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
//设置转换方式
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
//设置转换之后的文件类型
transformer.setOutputProperty(OutputKeys.MEDIA_TYPE, "xml");
//创建输入源 将上面写好的文件用转换器去转换。
//document就是输入源。需要转换的数据源
DOMSource domSource = new DOMSource(document);
//最后 开始转换
//transform()是将输入源的源文件转换成一个StreamResult
//里面第一个参数是输入源
//第二个是StreamResult 这个也是一个转换器
//将输入源简介转换为一个流
//实例化StreamResult有(StringWriter writer),
//(OutputStream out)(File file) 集中比较常用的方法
transformer.transform(domSource, new StreamResult(out));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
(2).Dom方式解析xml文件:
private void parserXml(String str) {
//Dom方式解析xml只有一种方式 使用工厂去调用DoucmentBuilder去创建Document
//创建一个DOM工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//因为是解析 所以需要输入流去读xml源文件
StringReader reader = new StringReader(str);
InputSource inputSource = new InputSource(reader);
try {
//创建一个DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
//通过DocumentBuilder去创建一个Document
Document document = builder.parse(inputSource);
//创建元素(Element) getDocumentElement()方法得到XML文件的根节点(最外层的节点)
Element infoElement = document.getDocumentElement();
//infoElement.getElementsByTagName("user")方法得到节点名字为user的所有节点,所以返回值应该是一个集合
NodeList nodeList = infoElement.getElementsByTagName("user");
//遍历集合
for (int i = 0; i < nodeList.getLength(); i++) {
//得到某一个user节点。NodeList.item(index)方法传入一个index下标位置去获得相应的user节点
Element userElement=(Element) nodeList.item(i);
//然后通过user节点获取所有的子节点,返回值也是一个集合
NodeList userChildList=userElement.getChildNodes();
//再遍历装有所有子元素的集合
for(int j = 0; j < userChildList.getLength(); j++){
//得到某一个子元素
Element childElement=(Element) userChildList.item(j);
//判断子元素是否是节点
if(childElement.getNodeType()==Node.ELEMENT_NODE){
//判断节点名称是否是name
if("name".equals(childElement.getNodeName())){
//childElement.getFirstChild().getNodeValue()得到节点之间的值。
//无论有多少个值,都是getFirstChild().getNodeValue()方法去获得值
System.out.println(childElement.getFirstChild().getNodeValue());
}else if(childElement.getNodeName().equals("sex")){
System.out.println(childElement.getFirstChild().getNodeValue());
}
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
1.Pull方式来操作xml。
(1).Pull方式创建xml文件:
private String createXml() {
/**
* 用pull方式创建xml 第一种方式 :使用工厂 XmlPullParserFactory factory =
* XmlPullParserFactory.newInstance(); 创建工厂 XmlSerializer serializer2 =
* factory.newSerializer(); 调用工厂创建xml生成器 第二种方式:直接创建生成器
*/
// 创建xml
// 创建xml生成器
XmlSerializer serializer = Xml.newSerializer();
StringWriter writer = new StringWriter();
try {
// 设置输出的方式,可以是Writer字符流也可以是OutPutStream字节流
serializer.setOutput(writer);
// 设置文件格式。第一个参数代表编码格式,第二个代表 xml的头部文件中的standalone属性。
// 如果为ture则代表为yes,为false则代表为no
serializer.startDocument("UTF-8", true);
// 设置xml根节点(最外层节点)第一个参数是这个节点所对应键(一般不用)
// 有starTag就有endTag 一定要有顺序。因为是跟节点。所以starTag和endTag皆在最外面
serializer.startTag("", "userinfo");
for (int i = 0; i <= 2; i++) {
// 在userinfo根节点里面创建一个user节点
serializer.startTag("", "user");
// 为这个节点声明属性
serializer.attribute("", "id", i + "");
// 再从user节点里面创建一个name节点
serializer.startTag("", "name");
// 那么节点里面的值。也就是<name>张三i</name>里面的张三i
serializer.text("张三" + i);
// 结束name节点
serializer.endTag("", "name");
serializer.startTag("", "sex");
serializer.text("男");
serializer.endTag("", "sex");
// 结束包裹 sex节点 name节点 的user节点
serializer.endTag("", "user");
}
// 结束最外层的节点
serializer.endTag("", "userinfo");
// 最后结束XML文件、这样XML文件的内部内容就已经写好了。
serializer.endDocument();
} catch (Exception e) {
e.printStackTrace();
}
/**
* File file = new File(Environment.getExternalStorageDirectory(),
* "PullCreateXml.xml");
* try {
* FileOutputStream fileOutPut = newFileOutputStream(file);
* 将创建好的xml内容输出到sdk保存为xml文件
* fileOutPut.write(createXml().getBytes());
* fileOutPut.close() } catch
* (Exception e) { e.printStackTrace(); }
*/
// 通过流返回xml的内容
return writer.toString();
}
(1).Pull方式解析xml文件:
private void parserXml(String str) { /** * 用pull方式解析xml * 第一种方式 :使用工厂 * XmlPullParserFactory factory =XmlPullParserFactory.newInstance(); 创建工厂 * XmlPullParser pullParser = factory.newPullParser(); 调用工厂创建xml解析器 * 第二种方式:直接创建解析器 */ //创建pull解析器 XmlPullParser parser = Xml.newPullParser(); //因为是解析所以需要xml文件,也就需要输入流去读取xml文件给PullParser解析器去解析 StringReader reader = new StringReader(str);//实例化一个字符输入流 try { //解析器设置输入的方式,可以是字符输入流Reader,也可以是字节输入流InputStream parser.setInput(reader); //解析器得到xml中的节点事件 int event = parser.getEventType(); //判断事件如果不是END_DOCUMENT则继续解析。END_DOCUMENT代表XML文件是否结束 while (event != XmlPullParser.END_DOCUMENT) { switch (event) { //如果是XML的根节点(最外层节点) case XmlPullParser.START_DOCUMENT: System.out.println("开始解析"); break; //如果是XML的节点 case XmlPullParser.START_TAG: Map<String, Object> map = new HashMap<String, Object>(); //判断节点名称是否是user parser,getName()可以得到当前解析的节点的名字 if ("user".equals(parser.getName())) { //parser.getAttributeValue()可以得到节点中的属性值,第一个参数是键名(一般为空) map.put("user_id", parser.getAttributeValue("", "id")); } else if ("name".equals(parser.getName())) { //parset.nextText()得到此节点的值 map.put("name", parser.nextText()); } else if ("sex".equals(parser.getName())) { map.put("sex", parser.nextText()); } datalist.add(map); break; //如果是xml的结束节点(也就是</name>之类的节点) case XmlPullParser.END_TAG: System.out.println("结束解析"); break; } //最后走完一个节点轮回的时候又让解析器去解析下一个节点轮回 /** * <user> * <name> * </name> * </user> * 相当于此user节点已经解析完,解析下一个user节点 */ event = parser.next(); } System.out.println(datalist); listView.setAdapter(new SimpleAdapter( this, datalist, R.layout.item, new String[] { "user_id", "name", "sex" }, new int[] { R.id.textView1, R.id.textView2, R.id.textView3 })); } catch (Exception e) { e.printStackTrace(); } }