美文网首页
2019-06-28 java-XML解析入坑记

2019-06-28 java-XML解析入坑记

作者: 东_11f3 | 来源:发表于2019-06-28 19:26 被阅读0次

    java-XML解析入坑记(血泪史)

    解决思路

    • 1.把xml(最好全量)文件转为json格式
    • 2.通过工具,把json格式数据生成对应javeBean
    • 3.通过工具类把xml转到javaBean

    方案一:使用import com.fasterxml.jackson.xml.XmlMapper;

    缺点:当xml中包含list列表时,因转译为对象,多个list只得到最后一条数据,数据丢失
    代码:

    <!-- fasterxml -->
            <dependency>
                <groupId>com.fasterxml</groupId>
                <artifactId>jackson-xml-databind</artifactId>
                <version>0.6.2</version>
            </dependency>
      /**
         * xml 转json
         */
        public static JSONObject convertXmlToJson(String xml) throws IOException {
            XmlMapper xmlMapper = new XmlMapper();
            JSONObject param = xmlMapper.readValue(xml, JSONObject.class);
    
            return param;
        }
    

    方案二:使用jdom2 工具包

    缺点:会把二级元素全部转为list格式,与非list javaBean 不对应,无法直接使用。
    代码:

    <dependency>
                <groupId>org.jdom</groupId>
                <artifactId>jdom</artifactId>
                <version>2.0.2</version>
            </dependency>
    
    
    public static JSONObject xml2Json(String xmlStr) throws JDOMException, IOException {
            if (StringUtils.isEmpty(xmlStr)) {
                return null;
            }
            xmlStr = xmlStr.replaceAll("\\\n", "");
            byte[] xml = xmlStr.getBytes("UTF-8");
            JSONObject json = new JSONObject();
            InputStream is = new ByteArrayInputStream(xml);
            SAXBuilder sb = new SAXBuilder();
            Document doc = sb.build(is);
            Element root = doc.getRootElement();
            json.put(root.getName(), iterateElement(root));
    
            return json;
        }
    
        private static JSONObject iterateElement(Element element) {
            List<Element> node = element.getChildren();
            JSONObject obj = new JSONObject();
            List list = null;
            for (Element child : node) {
                list = new LinkedList();
                String text = child.getTextTrim();
                if (StringUtils.isBlank(text)) {
                    if (child.getChildren().size() == 0) {
                        continue;
                    }
                    if (obj.containsKey(child.getName())) {
                        list = (List) obj.get(child.getName());
                    }
                    list.add(iterateElement(child)); //遍历child的子节点
                    obj.put(child.getName(), list);
                } else {
                    if (obj.containsKey(child.getName())) {
                        Object value = obj.get(child.getName());
                        try {
                            list = (List) value;
                        } catch (ClassCastException e) {
                            list.add(value);
                        }
                    }
                    if (child.getChildren().size() == 0) { //child无子节点时直接设置text
                        obj.put(child.getName(), text);
                    } else {
                        list.add(text);
                        obj.put(child.getName(), list);
                    }
                }
            }
            return obj;
        }
    
    

    方案三:使用JAXBContext工具(最终采用-java自带)

    Q&A:

    • 1.如果javaBean 中 字段 和 xml 中字段名全为大写可以直接转换
    • 2.若存在非大写,需要加上@XmlElement(name = "RptNo")方可取到值,但 如果 javaBean 中字段 前两个字母 全为大写,会报错,如:
    @XmlElement(name = "RPtTm")
        private String RPtTm;
    

    需改成:

    @XmlElement(name = "RPtTm")
        private String RptTm;
    

    工具代码:

    
     /**
         * xml字符串转bean
         * @param xmlStr
         * @param load
         * @return
         * @throws Exception
         * 2018-3-13
         */
        public static Object xml2Java(String xmlStr,Class<?> load) throws Exception {
            JAXBContext context = JAXBContext.newInstance(load);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            /*Object object = unmarshaller.unmarshal(new ByteArrayInputStream(xmlStr
                    .getBytes("utf-8")));*/
    
            //忽略namespace
            StringReader reader = new StringReader(xmlStr);
            SAXParserFactory sax = SAXParserFactory.newInstance();
            sax.setNamespaceAware(false);
            XMLReader xmlReader = sax.newSAXParser().getXMLReader();
            Source source = new SAXSource(xmlReader, new InputSource(reader));
            Object object = unmarshaller.unmarshal(source);
            return object;
        }
    

    相关文章

      网友评论

          本文标题:2019-06-28 java-XML解析入坑记

          本文链接:https://www.haomeiwen.com/subject/ynoecctx.html