当从页面上爬取数据时往往会得到xml格式的字符串返回值,此时解析该字符传获取自己需要的值往往是比较头疼的事,一下方式是在一个项目中用到的解析xml格式字符串的实例,记录下以便以后借鉴使用:
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.Namespace;
import org.jdom2.input.SAXBuilder;
public static void main(String[] args){
FmJkfwServiceImpl doc = new FmJkfwServiceImpl();
String xml = "<?xml version=\"1.0\" encoding=\"gb2312\"?>"+
"<Result xmlns=\"http://www.fiorano.com/fesb/activity/DBQueryOnInput2/Out\">"+
"<div id=\"gs\" name=\"gs\">"+
"<table class=\"myTable\">"+
"<tr>"+
"<td>社会信用代码(纳税人识别号):</td>"+
"<td id=\"nsr1\" colspan=\"2\">915xxxxxxJ</td>"+
"<td>纳税人名称:</td>"+
"<td colspan=\"2\">四川省xxxx有限公司</td>"+
"</tr>"+
"<tr class=\"sp\">"+
"<td>纳税人状态:</td>"+
"<td colspan=\"2\">正常</td>"+
"<td>课征主体登记类型:</td>"+
"<td colspan=\"2\">单位纳税人税务登记</td>"+
"</tr>"+
"<tr class=\"sp\">"+
"<td>注册地址:</td>"+
"<td colspan=\"2\">眉山市xxxx</td>"+
"<td>生产经营地址:</td>"+
"<td colspan=\"2\">眉山市xxxx</td>"+
"</tr>"+
"<tr>"+
"<td>法定代表人姓名:</td>"+
"<td>孙xx</td>"+
"<td>法定代表人身份证件类型:</td>"+
"<td>居民身份证</td>"+
"<td>法定代表人身份证号码:</td>"+
"<td>511xxxxxxx18</td>"+
"</tr>"+
"<tr class=\"sp\">"+
"<td>登记日期:</td>"+
"<td colspan=\"2\">2016-08-1</td>"+
"<td>主管税务机关:</td>"+
"<td colspan=\"2\">国家税务总局xxxxx税务局</td>"+
"</tr>"+
"<tr>"+
"<td>主管税务所(科、分局):</td>"+
"<td colspan=\"2\">国家税务总xxxx税务分局</td>"+
"<td>税收管理员:</td>"+
"<td colspan=\"2\">李xx</td>"+
"</tr>"+
"<tr class=\"sp\">"+
"<td>街道乡镇:</td>"+
"<td colspan=\"2\">xxx镇</td>"+
"<td>经营范围:</td>"+
"<td colspan=\"2\">销售:预包装食品、散装食品、乳制品(不含婴幼儿配方乳粉)、农副产品、化工产品(不含危险化学品)、管道配件、机电设备、五金交电、文化办公用品、金属材料。(依法须经批准的项目,经相关部门批准后方可开展经营活动)</td>"+
"</tr>"+
"<tr>"+
"<td>营改增纳税人类型:</td>"+
"<td></td>"+
"<td>会计制度(准则):</td>"+
"<td>小企业会计准则</td>"+
"<td>办证方式:</td>"+
"<td>国税独立办证</td>"+
"</tr>"+
"<tr class=\"sp\">"+
"<td>核算方式:</td>"+
"<td>独立核算自负盈亏</td>"+
"<td>国有控股类型:</td>"+
"<td></td>"+
"<td>国有投资比例:</td>"+
"<td>0</td>"+
"</tr>"+
"<tr>"+
"<td>自然人投资比例:</td>"+
"<td>0</td>"+
"<td>外资投资比例:</td>"+
"<td>0</td>"+
"<td>注册资本:</td>"+
"<td>1000000</td>"+
"</tr>"+
"</table>"+
"<div id=\"zfs\" name=\"zfs\">"+
"</div>"+
"</div>"+
"</Result>";
doc.xmlElements(xml);
}
解析xml:
public Map<String,Object> xmlElements(String xmlDoc) {
Map<String,Object> swdjxxMap = new HashMap<String,Object>();
//创建一个新的字符串
StringReader read = new StringReader(xmlDoc);
//创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
InputSource source = new InputSource(read);
//创建一个新的SAXBuilder
SAXBuilder sb = new SAXBuilder();
try {
//通过输入源构造一个Document
Document doc = sb.build(source);
//取的根元素
Element root = doc.getRootElement();
//System.out.println(root.getName());//输出根元素的名称(测试)
//得到根元素所有子元素的集合
List jiedian = root.getChildren();
//获得XML中的命名空间(XML中未定义可不写)
Namespace ns = root.getNamespace();
Element et = null;
List<String> swDjxxList=new ArrayList<String>();
for(int i=0;i<jiedian.size();i++){
et = (Element) jiedian.get(i);//循环依次得到子元素
List zjiedian = et.getChildren();
for(int j=0;j<zjiedian.size();j++){
Element xet = (Element) zjiedian.get(j);
List zjiediandian2 = xet.getChildren();
for(int m=0;m<zjiediandian2.size();m++){
Element xet2 = (Element) zjiediandian2.get(m);
List zjiediandian3 = xet2.getChildren();
for(int n=0;n<zjiediandian3.size();n++){
Element xet3 = (Element) zjiediandian3.get(n);
String tempStr=xet3.getContent().toString();
tempStr=tempStr.replace("[", "");
tempStr=tempStr.replace("]", "");
tempStr=tempStr.replace("Text: ", "");
swDjxxList.add(tempStr);
System.out.println( "222===="+tempStr);
}
}
}
}
if(null!=swDjxxList&&swDjxxList.size()>0){
swdjxxMap= makeData(swDjxxList);//提取数据
}else{
}
} catch (JDOMException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
return swdjxxMap;
}
抽取自己想要的数据:
public Map<String,Object> makeData(List<String> listStr) {
Map<String,Object> swdjxxMap = new HashMap<String,Object>();
for(int i=0;i<listStr.size();i++){
if(i%2==0){
String str=listStr.get(i);
switch(str){
case "社会信用代码(纳税人识别号):" :
swdjxxMap.put("shxydm", listStr.get(i+1));
break;
case "行业大类:" :
swdjxxMap.put("sshy", listStr.get(i+1));
break;
case "登记注册类型:" :
swdjxxMap.put("djzclx", listStr.get(i+1));
break;
case "注册资本:" :
swdjxxMap.put("zczb", listStr.get(i+1));
break;
case "注册地址:" :
swdjxxMap.put("zcdz", listStr.get(i+1));
break;
case "生产经营地址:" :
swdjxxMap.put("scjydz", listStr.get(i+1));
break;
case "经营范围:" :
swdjxxMap.put("jyfw", listStr.get(i+1));
break;
case "登记日期:" :
swdjxxMap.put("cxsj", makeDate(listStr.get(i+1)));//跟当前时间求差算出时间 待处理
break;
case "法定代表人姓名:" :
swdjxxMap.put("fddbrxm", listStr.get(i+1));
break;
case "法定代表人移动电话:" :
swdjxxMap.put("fddbryddh", listStr.get(i+1));
break;
case "办税人姓名:" :
swdjxxMap.put("bsrxm", listStr.get(i+1));
break;
case "办税人移动电话:" :
swdjxxMap.put("bsryddh", listStr.get(i+1));
break;
case "财务负责人姓名:" :
swdjxxMap.put("cwfzrxm", listStr.get(i+1));
break;
case "财务负责人移动电话:" :
swdjxxMap.put("cwfzryddh", listStr.get(i+1));
break;
default : //可选
//语句
}
}
}
return swdjxxMap;
}