diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 63801bc7..f8f5ce46 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -114,6 +114,11 @@ assertj-guava test + + org.dom4j + dom4j + 2.0.0 + diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/XmlUtils.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/XmlUtils.java new file mode 100644 index 00000000..cd3a7a98 --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/XmlUtils.java @@ -0,0 +1,96 @@ +package me.chanjar.weixin.common.util; + +import java.io.StringReader; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.Node; +import org.dom4j.io.SAXReader; +import org.dom4j.tree.DefaultText; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + +/** + *
+ * XML转换工具类.
+ * Created by Binary Wang on 2018/11/4.
+ * 
+ * + * @author Binary Wang + */ +public class XmlUtils { + + public static Map xml2Map(String xmlString) { + Map map = new HashMap<>(16); + try { + SAXReader saxReader = new SAXReader(); + Document doc = saxReader.read(new StringReader(xmlString)); + Element root = doc.getRootElement(); + List elements = root.elements(); + for (Element element : elements) { + map.put(element.getName(), element2MapOrString(element)); + } + } catch (DocumentException e) { + throw new RuntimeException(e); + } + + return map; + } + + private static Object element2MapOrString(Element element) { + Map result = Maps.newHashMap(); + + final List content = element.content(); + if (content.size() <= 1) { + return element.getText(); + } + + final Set names = names(content); + if (names.size() == 1) { + // 说明是个列表,各个子对象是相同的name + List list = Lists.newArrayList(); + for (Node node : content) { + if (node instanceof DefaultText) { + continue; + } + + if (node instanceof Element) { + list.add(element2MapOrString((Element) node)); + } + } + + result.put(names.iterator().next(), list); + } else { + for (Node node : content) { + if (node instanceof DefaultText) { + continue; + } + + if (node instanceof Element) { + result.put(node.getName(), element2MapOrString((Element) node)); + } + } + } + + return result; + } + + private static Set names(List nodes) { + Set names = Sets.newHashSet(); + for (Node node : nodes) { + if (node instanceof DefaultText) { + continue; + } + names.add(node.getName()); + } + + return names; + } +} diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/XmlUtilsTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/XmlUtilsTest.java new file mode 100644 index 00000000..1afd1c1d --- /dev/null +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/XmlUtilsTest.java @@ -0,0 +1,78 @@ +package me.chanjar.weixin.common.util; + +import java.util.List; +import java.util.Map; + +import org.testng.annotations.*; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + *
+ *
+ * Created by Binary Wang on 2018/11/4.
+ * 
+ * + * @author Binary Wang + */ +public class XmlUtilsTest { + + @Test + public void testXml2Map() { + String xml = "\n" + + "\n" + + "2\n" + + "\n" + + "\n" + + "1\n" + + "0\n" + + "2\n" + + "\n" + + "1\n" + + "1\n" + + "1\n" + + "1\n" + + "\n" + + "\n" + + "2\n" + + "0\n" + + "2\n" + + "\n" + + "1\n" + + "1\n" + + "1\n" + + "1\n" + + "\n" + + "\n" + + "2\n" + + "\n" + + ""; + + final Map map = XmlUtils.xml2Map(xml); + assertThat(map).isNotNull(); + final Map copyrightCheckResult = (Map) map.get("CopyrightCheckResult"); + List> resultList = (List>) ((Map) copyrightCheckResult.get("ResultList")).get("item"); + assertThat(copyrightCheckResult).isNotNull(); + + assertThat(copyrightCheckResult.get("Count")).isEqualTo("2"); + assertThat(copyrightCheckResult.get("CheckState")).isEqualTo("2"); + + assertThat(resultList.get(0).get("ArticleIdx")).isEqualTo("1"); + assertThat(resultList.get(0).get("UserDeclareState")).isEqualTo("0"); + assertThat(resultList.get(0).get("AuditState")).isEqualTo("2"); + assertThat(resultList.get(0).get("OriginalArticleUrl")).isEqualTo("Url_1"); + assertThat(resultList.get(0).get("OriginalArticleType")).isEqualTo("1"); + assertThat(resultList.get(0).get("CanReprint")).isEqualTo("1"); + assertThat(resultList.get(0).get("NeedReplaceContent")).isEqualTo("1"); + assertThat(resultList.get(0).get("NeedShowReprintSource")).isEqualTo("1"); + + assertThat(resultList.get(1).get("ArticleIdx")).isEqualTo("2"); + assertThat(resultList.get(1).get("UserDeclareState")).isEqualTo("0"); + assertThat(resultList.get(1).get("AuditState")).isEqualTo("2"); + assertThat(resultList.get(1).get("OriginalArticleUrl")).isEqualTo("Url_2"); + assertThat(resultList.get(1).get("OriginalArticleType")).isEqualTo("1"); + assertThat(resultList.get(1).get("CanReprint")).isEqualTo("1"); + assertThat(resultList.get(1).get("NeedReplaceContent")).isEqualTo("1"); + assertThat(resultList.get(1).get("NeedShowReprintSource")).isEqualTo("1"); + } +}