Fixed problem resolving overwriting of node values with the same name in different namespaces

pull/351/head
guqing 2019-10-29 15:09:38 +08:00
parent 463b786671
commit a276f27c7b
1 changed files with 66 additions and 28 deletions

View File

@ -4,48 +4,64 @@ import org.dom4j.Document;
import org.dom4j.Element; import org.dom4j.Element;
import org.dom4j.io.SAXReader; import org.dom4j.io.SAXReader;
import java.io.File; import java.io.*;
import java.io.FileInputStream;
import java.util.*; import java.util.*;
/** /**
* WordPress xml Map * wordpressxmlMap
*
* @author guqing * @author guqing
* @date 2019-10-29 14:49
*/ */
public class XmlTransferMapUtils { public class TransferMapProcessor {
/** /**
* List * List
*/ */
private static final List<String> ARRAY_PROPERTY = Arrays.asList("channel", "item", "category", "postmeta", "comment"); private static final List<String> ARRAY_PROPERTY = Arrays.asList("channel", "item", "category", "postmeta", "comment");
/**
* mapxml
*/
private File file;
public TransferMapProcessor(File file) {
this.file = file;
}
/** /**
* xmlxmlrootElement * xmlxmlrootElement
*
* @param file xml * @param file xml
* @return * @return
*/ */
public Element getRootElement(File file) { private Element getRootElement(File file) {
try { try {
SAXReader saxReader = new SAXReader(); SAXReader saxReader = new SAXReader();
FileInputStream fileInputStream = new FileInputStream(file); FileInputStream fileInputStream = new FileInputStream(file);
Document document = saxReader.read(fileInputStream); Document document = saxReader.read(fileInputStream);
return document.getRootElement(); return document.getRootElement();
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("can not get root element"); throw new RuntimeException("can not get root element");
} }
} }
/**
* xml
* @return xmlMap
*/
public Map<String, Object> getResultSetMapping() {
Element rootElement = getRootElement(file);
return getResultSetMapping(rootElement);
}
/** /**
* Map * Map
*
* @param root xml * @param root xml
* @return xmlMap * @return xmlMap
*/ */
public Map<String, Object> getResultSetMapping(Element root) { private Map<String, Object> getResultSetMapping(Element root) {
Map<String, Object> result; Map<String, Object> result = new HashMap<String, Object>();
try { try {
// 获取根元素的所有子元素 // 获取根元素的所有子元素
List<Element> children = root.elements(); List<Element> children = root.elements();
@ -61,7 +77,6 @@ public class XmlTransferMapUtils {
/** /**
* xmlN * xmlN
*
* @param elements * @param elements
* @param list * @param list
* @return Map * @return Map
@ -70,8 +85,17 @@ public class XmlTransferMapUtils {
Map<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map = new HashMap<String, Object>();
for(Element element : elements){ for(Element element : elements){
String name = element.getName(); // getName获取到的节点名称不带名称空间例如<wp:content/>获取到name为content
//如果是定义成数组 String nameWithoutPrefix = element.getName();
// 需要使用的真是name默认等于不带名称空间的,如果名称存在空间则name的形式为: 名称空间:名称
String name = nameWithoutPrefix;
String preifx = element.getNamespace().getPrefix();
if(isNotBlack(preifx)) {
name = preifx + ":" +nameWithoutPrefix;
}
//判断节点是否在定义的数组中,如果存在将其创建成List集合,否则作为文本
if(ARRAY_PROPERTY.contains(name)) { if(ARRAY_PROPERTY.contains(name)) {
//继续递归循环 //继续递归循环
List<Map<String,Object>> sublist = new ArrayList<Map<String,Object>>(); List<Map<String,Object>> sublist = new ArrayList<Map<String,Object>>();
@ -99,7 +123,21 @@ public class XmlTransferMapUtils {
if(list != null) { if(list != null) {
list.add(map); list.add(map);
} }
//返回结果集合 //返回结果集合
return map; return map;
} }
/**
* , {@code true}, {@code false}
* @param str
* @return true,false
*/
private boolean isNotBlack(String str) {
if(str != null && str.length() > 0 && str.trim().length() > 0) {
return true;
}
return false;
}
} }