前言
调用WebService
接口返回了XML
的数据, 需要解析并封装为一个AjaxDto(status, msg, obj)
对象。
项目中已经依赖了Apache
的commons-configuration, 所以就直接拿来用了。
样例
响应体
1 2 3 4 5 6 7
| <?xml version="1.0" encoding="GBK" ?> <response> <head> <code>integer</code> <message>String</message> </head> </response>
|
解析代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| public class XmlParser { private static final Logger logger = LoggerFactory.getLogger(XmlParser.class);
public static void main(String[] args) throws Exception { String xml = "<?xml version=\"1.0\" encoding=\"GBK\" ?> \n" + "<response>\n" + "<head>\n" + "<code>integer</code>\n" + "<message>String</message>\n" + "</head>\n" + "</response>\n"; XmlParser parser = XmlParser.init(xml); if(parser == null){ logger.error("创建失败"); return; } System.out.println(parser.getString("head.code")); }
private XMLConfiguration config;
public static XmlParser init(String xml) { try (InputStream in = new ByteArrayInputStream(xml.getBytes());) { XmlParser parser = new XmlParser(in); return parser; } catch (IOException | ConfigurationException e) { logger.error("加载xml错误", e); } return null; }
private XmlParser(InputStream in) throws ConfigurationException { config = new XMLConfiguration(); config.load(in); } public String getString(String xpath){ return config.getString(xpath); } }
|
坑
注意以下代码
1 2
| System.out.println(parser.getString("response.head.code")); System.out.println(parser.getString("head.code"));
|
我第一次使用的时候, 是使用第一行response.head.code
代码的, 但是获取失败。
改成第二行head.code
代码就行了。
后来想了下原因, response
是根节点, 根节点有且只有一个。所以也就不需要特意去指定了。