jaxb解析xml遇到的问题
之前使用jaxb来解析webservice返回的xml,由于xml的格式总是会出现意想不到的变化,导致xml格式通过不了jaxb解析而报错,现已放弃jaxb解析,记录下下来自己是怎么修改的, @SuppressWarnings("unchecked") public static List<Map<Object,Object>> readXml(String xmlStr) throws Exception{ Document doc = null; List<Map<Object,Object>> list = null; try { list = new ArrayList<Map<Object,Object>>(); doc = DocumentHelper.parseText(xmlStr); // 将字符串转为XML Element rootElement = doc.getRootElement(); System.out.println(rootElement.toString()); Iterator<Element> ite = rootElement.elements().iterator(); while (ite.hasNext()) { Element element = (Element) ite.next(); Map<Object,Object> map = traversingTree(element); if (map.size() == 0) continue; list.add(map); } } catch (Exception e) { e.printStackTrace(); } return list; } public static Map<Object,Object> traversingTree(Element element) { Map<Object,Object> map = new ConcurrentHashMap<Object,Object>(); for (int i = 0,size = element.nodeCount(); i < size; i++) { Node node = element.node(i); if (node instanceof Element) { traversingTree((Element) node); map.put(node.getName(),node.getText()); } } return map; } } public abstract class Xml2Object { @SuppressWarnings({ "unchecked","rawtypes" }) public Xml2Object() { Type genType = getClass().getGenericSuperclass(); Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); clazz = (Class) params[0]; } public List<T> getObjectCollection(String xmlStr) { List<Map<Object,Object>> list = null; try { list = XmlTranslator.readXml(xmlStr); } catch (Exception e1) { e1.printStackTrace(); } if (Assert.isEmpty(list)) return null; List<T> collection = new ArrayList<T>(); try { T entity = null; Field[] fields = clazz.getDeclaredFields(); for (Map<Object,Object> map : list) { entity = clazz.newInstance(); for (Field field : fields) { String fieldName = field.getName(); String setMethodName = "set" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1); XmlElement element = field.getAnnotation(XmlElement.class); String elementName = element.name(); Object elementValue = null; Class<?> type = field.getType(); Method method = clazz.getMethod(setMethodName,type); if (!"##default".equals(elementName)) { elementValue = map.get(elementName); } else { elementValue = map.get(fieldName); } method.invoke(entity,type.cast(elementValue)); } collection.add(entity); } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return collection; } } } User: //get、set省略 } 测试 @Test public void main(){ String xml=”something”; Xml2Object visitorUtil = new Xml2User(); List infos = visitorUtil.getObjectCollection(xml); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |