xml字符串解析:
<persons>
<person id="1">
<name>name1</name>
<age>18</age>
</person>
<person id="2">
<name>name2</name>
<age>17</age>
</person>
</persons>
1.创建解析器,传入要解析的字符串:
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new StringReader(xmlStr));
2.循环遍历标签读取:
while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {//从解析开始遍历标签
switch (event) {
case XmlPullParser.START_DOCUMENT://解析开始开始时触发
break;
case XmlPullParser.START_TAG://标签开始时触发
break;
case XmlPullParser.END_TAG://标签结束时触发
key = parser.getName();
break;
}
3.读取数据:
对于读取xml的数据,要注意的是,要区分开来:
<persons>
<person id="1">
<name>name1</name>
<age>18</age>
</person>
<person id="2">
<name>name2</name>
<age>17</age>
</person>
</persons>
比如这个xml数据,读取到person标签时:
读取id的名称方法是:parser.getAttributeName(0)
读取id的值的方法是: parser.getAttributeValue(0) ,0是因为它只有一个属性
这时读取person中间的值的字符串,就是包括了name、age的标签字符串的方法是:parser.nextText()
读取完person的标签数据后,循环next读取到name的标签,这时:
parser.getAttributeName(0), 数组越界,因为这个标签没有属性。
parser.getAttributeValue(0) , 数组越界,因为这个标签没有属性。
parser.nextText() 返回name1
下面是解析生成多个数据体的方法:
/**
* @param xmlStr 多个xml结构体字符串
*
* @param objecttype单个结构体类型
* @param starttag 单个xml结构体的开始与结束节点名称
* @return 不会返回null,解析出错可能返回无数据
* --------------------
* TODO 多个结构体的xml数据解析,注意的是,objecttype不支持复杂的类型,只支持基本类型格式与字符串
* --------------------
*/
public static <T> List<T> getObjectsFromXmlObjects(String xmlStr, Class<T> objecttype, String starttag) {
XmlPullParser parser = Xml.newPullParser();
List<T> datas = new ArrayList<T>();
List<Field> publicFields = getPublicFields(objecttype);
T t = null;
String key = "";
String value = "";
try {
parser.setInput(new StringReader(xmlStr));
int event = 0;
while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT://解析开始开始时触发
break;
case XmlPullParser.START_TAG://标签开始时触发
key = parser.getName();
if (key.equals(starttag)) {// 判断到是开始tag
try {// 重新创建一个实例
t = objecttype.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
} else {
if (t != null) {// 不出错才处理
value = parser.nextText();
value = value==null?"":value;//如果是null的话,变为空字符
for (Field field : publicFields) {
// 获得属性名
String n = field.getName();
// 如果属性名与键相同
if (n.equalsIgnoreCase(key)) {
Object tagvalue = null;
try {
// 获得当前属性的类型和值
// 类型的话如果是基本类型,会自动装箱
tagvalue = field.get(t);
// 判断各种类型,调用各种类型的put方法将数据存储进去
if (tagvalue instanceof String||tagvalue==null) {//字符串的话可能出现tagvalue==null
tagvalue = value;
} else if (tagvalue instanceof Integer) {
tagvalue = Integer.valueOf(value);
} else if (tagvalue instanceof Float) {
tagvalue = Float.valueOf(value);
} else if (tagvalue instanceof Long) {
tagvalue = Long.valueOf(value);
} else if (tagvalue instanceof Boolean) {
tagvalue = Boolean.valueOf(value);
} else if (tagvalue instanceof Double) {
tagvalue = Double.valueOf(value);
}
field.set(t, tagvalue);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
break;
case XmlPullParser.END_TAG://解析结束时触发
key = parser.getName();
if (key!=null&&key.equals(starttag)) {
if (t != null) {
datas.add(t);
}
}
break;
}
}
} catch (XmlPullParserException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return datas;
}
2.xml字符串生成:
public static String pullXMLCreate(Object xmldata, String starttag) {
if (xmldata == null)
throw new NullPointerException("xmldata can not be null");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();//用这个可以设置编码
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlSerializer xmlSerializer = factory.newSerializer();
xmlSerializer.setOutput(outputStream, "utf-8"); // 保存创建的xml
pullXMLCreatefromObject(xmlSerializer, xmldata, starttag);
} catch (XmlPullParserException e) { // XmlPullParserFactory.newInstance
e.printStackTrace();
} catch (IllegalArgumentException e) { // xmlSerializer.setOutput
e.printStackTrace();
} catch (IllegalStateException e) { // xmlSerializer.setOutput
e.printStackTrace();
} catch (IOException e) { // xmlSerializer.setOutput
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
try {
return outputStream.toString("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "";
}
private static <T> List<Field> getPublicFields(Class<?> clazz) {
// 用来存储clazz中用public修饰的属性的list
List<Field> list = new ArrayList<Field>();
// 获得clazz中所有用public修饰的属性
Field[] fields = clazz.getFields();
// 将fields加入到list中
for (int i = 0; i < fields.length; i++) {
list.add(fields[i]);
}
return list;
}
笔记:
xmlSerializer.startTag(null, tagName);
// xmlSerializer.text(tagValue + "");这个不写,显示<root><msgType /><srcIp /><destIp /><roomId /><strMsg /></root>这种格式
xmlSerializer.endTag(null,tagName);
如果,下面传入的不是null而是true时,会有standalone
xmlSerializer.startDocument("UTF-8", true);