平时习惯用Json格式来保存传递数据,xml的生成解析不太熟悉,写的有点乱
一个典型的xml格式文本
<?xml version="1.0" encoding="utf-8"?>
<LOL>
<person>
<!-- 这里是盖伦的注释 -->
<name sex="man">盖伦</name>
<address>德玛西亚</address>
<say>我将带头冲锋</say>
</person>
<person>
<!-- 这里是亚索的注释 -->
<name sex="man">亚索</name>
<address>艾欧尼亚</address>
<say>死亡如风,常伴吾身</say>
</person>
<person>
<!-- 这里是瑞雯的注释 -->
<name sex="girl">瑞雯</name>
<address>诺克萨斯</address>
<say>战争与谋杀之间,潜藏着我们的心魇</say>
</person>
</LOL>
Pull解析
创建实例
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
(也可以通过Xml.newPullParser()得到)
xpp.setInput ( new FileReader (filename ) );
五个事件类型
there is only one key method next() that is used to retrieve next event and there are only five events:
START DOCUMENT:文档开始时,解析器还没有读取任何数据
START_TAG:解析到标签开头
TEXT:解析到元素的内容
END_TAG:解析在标签的末尾
END_DOCUMENT:文档结束,之后不会再解析了
主要方法
getName()
getText()
next(),nextToken()
setInput(InputStream, String)
getEventType()
getAttributeName,getAttributeValue
示例代码
public void pullParse(View view) {
String xmlData = getXMLData(fileName);
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance()
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
int eventType = xmlPullParser.getEventType();
String name = "";
String address = "";
String say = "";
String sex = "";
while (eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (eventType) {
case XmlPullParser.START_TAG: {
if ("name".equals(nodeName)) {
// sex与name的位置不能互换
// sex = xmlPullParser.getAttributeValue(0);
sex = xmlPullParser.getAttributeValue(null, "sex");
name = xmlPullParser.nextText();
} else if ("address".equals(nodeName)) {
address = xmlPullParser.nextText();
} else if ("say".equals(nodeName)) {
say = xmlPullParser.nextText();
}
break;
}
// 完成解析某个结点
case XmlPullParser.END_TAG: {
if ("person".equals(nodeName)) {
Log.d(TAG, "name: " + name);
Log.d(TAG, "address: " + address);
Log.d(TAG, "say: " + say);
Log.d(TAG, "sex: " + sex);
}
break;
}
default:
break;
}
eventType = xmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
XmlSerializer生成XML
两种获取实例
XmlSerializer serializer = Xml.newSerializer();
xmlPullParserFactory=XmlPullParserFactory.newInstance();
XmlSerializer serializer = xmlPullParserFactory.newSerializer();
主要方法
setOutput
startDocument
startTag
attribute
text
endTag
endDocument
示例代码
try {
XmlSerializer serializer = Xml.newSerializer();
OutputStream outputStream = System.out;
serializer.setOutput(outputStream, "UTF-8");
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "persons");
serializer.startTag(null, "person");
serializer.attribute(null, "id", String.valueOf(10));
serializer.text("小明");
serializer.endTag(null, "person");
serializer.endTag(null, "persons");
serializer.endDocument();
}catch (IOException e) {
e.printStackTrace();
}
SAX解析
示例
实体类继承DefaultHandler
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
// 将ContentHandler的实例设置到XMLReader中
xmlReader.setContentHandler(handler);
// 开始执行解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
XML命名空间
XML Namespace (xmlns) 属性
XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:
xmlns:namespace-prefix="namespaceURI"
当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
XML 命名空间提供避免元素命名冲突的方法。两个文档使用了不同的命名空间来命名它们的<table>元素 (<h:table>和<f:table>)。通过使用前缀,我们创建了两种不同类型的<table>元素。