玩转XML
每次获取xml文本值或遍历子节点的时候,看到这个xml的节点这么深怎么获取我们想要的节点、和文本呢??? 好了闲话不扯了,该是我们演示的时候。
1、实例: xml 字符串转xml对象 注意:xml文件同样方式解析
String xmlString =
“<result>
<status>success</status>
<statuscode>1</statuscode>
<time>2015-03-31 06:58:14</time>
<dataInfo></dataInfo>
<dataType>xml</dataType>
<data>
<position>
<ha>
<city>北京</city>
<citycode>bj</citycode>
<region>昌平区</region>
<distcode>cp</distcode>
<haname>天通苑</haname>
<proptypename>住宅</proptypename>
<proptypecode>11</proptypecode>
</ha>
<ha>
<city>南京</city>
<citycode>bj</citycode>
<region>昌平区</region>
<distcode>cp</distcode>
<haname>天通苑</haname>
<proptypename>住宅</proptypename>
<proptypecode>11</proptypecode>
</ha>
</position>
<location>
<lon>116.41548206505098</lon>
<lat>40.06153204024281</lat>
</location>
<district>
<item>
<distname>昌平区</distname>
<distcode>cp</distcode>
</item>
</district>
</data>
</result> "
2、采用dom4j进行解析
1)、获取指定节点文本值,但不知是否有多个
//String xmlString :xml字符串;String nameSpace :命名空间 例:/result/data/position/ha /city
public List<String> strConvertXml(String xmlString ,String nameSpace){
List<String> alist = null;
Document doc = null;
try {
doc = DocumentHelper.parseText(xmlString); // 将字符串转为XML
alist = new ArrayList<String>();
// 获取/result/data/position/ha 为了判读ha这级是否有多个
String parentPath = nameSpace.substring(0,nameSpace.lastIndexOf("/"));
// 获取city这个节点
String subPath = nameSpace.substring(nameSpace.lastIndexOf("/")+1);
// 获取子节点
List list = doc.selectNodes(parentPath);
if(list.size()>0){
for (Iterator iter = list.iterator(); iter.hasNext();) {
Element ele=(Element)iter.next();
// 获取子节点的文本值
String eleStr = ele.element(subPath).getText();
alist.add(eleStr);
}
}
}catch(DocumentException e){
e.printStackTrace();
}
return alist;
}
控制台打印结果: 北京 南京
2)、获取已知指定节点
Document doc = DocumentHelper.parseText(xmlString); // 将字符串转为XML
// 获取指定的节点(可以进行setText()/getText())
例如:doc.selectSingleNode("/result/status ").getText()
//获取指定属性节点的文本值(<status winTermNo=\"10077\" > success </status>)
例如:doc.selectSingleNode("/result/status@winTermNo ").getText()
//获取指定属性的value值(<ha id="1" > 北京</ha>)
例如:
List nodeList = doc.selectNodes(" /result/data/position/ha ");
for(Iterator iter = nodeList.iterator();iter.hasNext()){
Element ele = (Element)iter.next();
String id = ele.attribute("id").getValue();
}
玩转JSON
将json字符串转成json对象进行解析
1、实例 (net.sf.json 进行解析)
String jsonString="{\"status\": \"success\", \"statuscode\": \"1\", \"time\": \"2015-11-16 16:10:43\", \"dataInfo\": \"\", \"data\": { \"drawdata\": { \"total\": \"316\",\"row\": [ { \"maxb\": \"246\",\"count\": \"13\",\"minp\": \"95\",\"minb\": \"45\",\"maxp\": \"1200\",\"room\": \"1\"},{ \"maxb\": \"165\", \"count\": \"58\", \"minp\": \"193\", \"minb\": \"95\",\"maxp\": \"950\", \"room\": \"2\"}, { \"maxb\": \"203\", \"count\": \"213\",\"minp\": \"220\",\"minb\": \"120\",\"maxp\": \"1200\", \"room\": \"3\" }, { \"maxb\":\"248\", \"count\": \"32\",\"minp\": \"420\", \"minb\": \"173.39\", \"maxp\": \"1480\", \"room\": \"4\" } ] }},\"dataType\": \"json\" }"
2、解析json节点
// String jsonString : json字符串 String nameSpace : 命名空间 例:data/drawdata/row/maxb
public List<String> strConvertJson(String jsonString,String nameSpace){
List<String> alist = new ArrayList<String>();
String[] split = nameSpace.split("/");
JSONObject jsonObject = JSONObject.fromObject( jsonString );
// 判断节点的层级(层级大于一层的)
if(split.length>1){
String parentPath = nameSpace.substring(0,nameSpace.lastIndexOf("/"));
split = parentPath.split("/");
String subPath = nameSpace.substring(nameSpace.lastIndexOf("/")+1);
for(int i=0;i<split.length;i++){
if(i==split.length-1){
//获取jsonArray数组
JSONArray jsonArray = jsonObject.getJSONArray(split[i]);
if(jsonArray!=null&&jsonArray.size()>0){
for (int j = 0; j < jsonArray.size(); j++) {
alist.add((String)jsonArray.getJSONObject(j).get(subPath));
}
}else{
//获取jsonObject对象
jsonObject = (JSONObject)jsonObject.get(split[i]);
//通过get(”节点“)的方法获取对应的文本值
alist.add((String)jsonObject.get(subPath));
break;
}
}else{
// 层级等于一层
jsonObject = (JSONObject)jsonObject.get(split[i]);
}
}
}else{
alist.add((String)jsonObject.get(split[0]));
}
return alist;
}
以上为自己所经历的项目,望读者有所收益。