来在开始之前我们把需要的几个工具先写好和xml的验证文件
- 创建xsd文件夹放piccImportData.xsd,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns="http://www.w3school.com.cn" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.w3school.com.cn"> <xs:element name="askinfo" type="caseInfo"></xs:element> <xs:complexType name="caseInfo"> <xs:all> <xs:element name="token"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="1"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="platform" type="xs:string"/> <xs:element name="vehicleinfo"> <xs:complexType> <xs:all> <xs:element name="registNo"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="1"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="handlerCode" type="xs:string"/> <xs:element name="handlerName" type="xs:string"/> </xs:all> </xs:complexType> </xs:element> <xs:element name="components"> <xs:complexType> <xs:sequence> <xs:element name="component" minOccurs="1" maxOccurs="unbounded"> <xs:complexType> <xs:all> <xs:element name="spartNo" type="xs:string"/> <xs:element name="spartName" type="xs:string"/> </xs:all> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:all> </xs:complexType> </xs:schema>
- 创建picc文件夹放ImportAskRquest.xml和ImportVechcleRequest.xml
<?xml version="1.0" encoding="UTF-8"?> <askinfo> <token>${token}</token> <platform>${platform}</platform> <vehicleinfo>${vehicleinfo}</vehicleinfo> <components>${components}</components> </askinfo>
<?xml version="1.0" encoding="UTF-8"?> <vehicleinfo> <registNo>${scase_no}</registNo> <handlerCode>${suser_no}</handlerCode> <handlerName>${suser_name}</handlerName> </vehicleinfo>
- 创建一个util工具类来放XmlXsdValidator.java、WbXmlDataUtil.java、Txt.java和XmlUtil.java工具类
- XmlXsdValidator.java的内容如下:
import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.InputStream; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.w3c.dom.Document; public class XmlXsdValidator { /** * 检查xml格式是否正确 * @param xml xml字符串 * @param xsdFileName xsd验证文件路径 * @return * @throws Exception */ public static boolean checkXmlFormat(String xml, String xsdFileName) throws Exception { String strlang = XMLConstants.W3C_XML_SCHEMA_NS_URI; SchemaFactory factory = SchemaFactory.newInstance(strlang); InputStream xsdInput = new FileInputStream(xsdFileName); StreamSource ss = new StreamSource(xsdInput); Schema schema = factory.newSchema(ss); Validator validator = schema.newValidator(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); InputStream xmlInput = new ByteArrayInputStream(xml.getBytes("UTF-8")); Document document = db.parse(xmlInput); DOMSource source = new DOMSource(document); validator.validate(source); return true; } }
- WbXmlDataUtil.java的内容:
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.dom4j.Document; import org.dom4j.Element; public class WbXmlDataUtil { public static Map<String,Object> domToMap(Element e1,String modelFileName) throws Exception{ String content = getContent(modelFileName); if(!content.startsWith("<?xml")) content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+content; Document doc = XmlUtil.string2Document(content); Element root = doc.getRootElement(); Map<String,Object> map = new HashMap<String, Object>(); Iterator elements = root.elementIterator(); while(elements.hasNext()){ Element e = (Element) elements.next(); try{ String text = e1.element(e.getName()).asXML(); map.put(e.getText().substring(2,e.getText().length()-1), text.substring(e.getName().length()+2, text.length()-e.getName().length()-3)); }catch (Exception er) { // TODO: handle exception map.put(e.getText().substring(2,e.getText().length()-1),""); } } return map; } public static Map<String,Object> strToMap(String str,String modelFileName) throws Exception{ Document doc = XmlUtil.string2Document(str); Element root = doc.getRootElement(); return WbXmlDataUtil.domToMap(root, modelFileName); } public static String getPath(String fileName) throws Exception{ String path = WbXmlDataUtil.class.getResource("") .toURI().getPath(); path = path.substring(0,path.lastIndexOf("/classes")) + "/classes/"+fileName; return path; } public static String getContent(String fileName) throws Exception{ Txt txt = new Txt(getPath(fileName)); return txt.read(); } }
- Txt.java的内容:
public class Txt { private String fileName; public Txt(String fileName){ this.fileName = fileName; } public String read() throws Exception{ InputStreamReader isr = new InputStreamReader(new FileInputStream(new File(fileName)), "UTF-8"); BufferedReader br = new BufferedReader(isr); String s; StringBuffer sb = new StringBuffer(); while ((s = br.readLine()) != null) { sb.append(s+"\r\n"); } // fpReader.close(); br.close(); return sb.toString(); } public void write(String str,boolean isAppend) throws Exception{ File file = new File(fileName); if(!file.exists())file.createNewFile(); if(isAppend){ RandomAccessFile raf = new RandomAccessFile(file, "rw"); raf.seek(raf.length()); raf.write(str.getBytes()); raf.close(); } else { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); bos.write(str.getBytes("UTF-8")); bos.flush(); bos.close(); } } }
- XmlUtil.java的内容:
import org.dom4j.DocumentHelper; public class XmlUtil { /** * string2Document 将字符串转为Document * @return * @param s xml格式的字符串 */ public static Document string2Document(String s) { Document doc = null; try { doc = DocumentHelper.parseText(s); } catch (Exception ex) { ex.printStackTrace(); } return doc; } }
上面的需要的准备好了,接下来就接口实现类了
import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
import javax.annotation.PostConstruct;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;
import com.lcx.test.bean.Car;
import com.lcx.test.dao.DBManager;
import com.lcx.test.service.LCarService;
import com.lcx.test.util.WbXmlDataUtil;
import com.lcx.test.util.XmlXsdValidator;
@Component("testCarService")
@DependsOn({"DBManager"})
public class LCarServiceImpl implements LCarService {
//log
private static Logger log=LoggerFactory.getLogger(LCarServiceImpl.class);
@Override
public Class<?> getType() {
return LCarService.class;
}
/**
* 初始化
*/
@PostConstruct
public void init(){
DBManager.getInstance().addApi(this);
}
@Override
public String importData(String xml) throws Exception {
log.info("调用importData");
xml = xml.replaceAll("[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]", "");
String checkResult = checkXml(xml, "piccImportData.xsd");
if(!checkResult.equals("success"))return checkResult;
Element root = getRootElement(xml);
Map<String,Object> askInfo = WbXmlDataUtil.domToMap(root, "picc/ImportAskRquest.xml");
Map<String,Object> vehicleInfo = WbXmlDataUtil.strToMap("<a>"+askInfo.get("vehicleinfo")+"</a>", "picc/ImportVechcleRequest.xml");
//对应的ImportVechcleRequest.xml
String report_code = vehicleInfo.get("scase_no").toString(); //3
String handler_code = vehicleInfo.get("suser_no").toString(); //17
String handler_name = vehicleInfo.get("suser_name").toString(); //18
Car lpCar = new Car();
lpCar.setReportCode(report_code);
lpCar.setHandlerCode(handler_code);
lpCar.setHandlerName(handler_name);
//插入数据库信息(这个是对应的框架储存数据库的方法,或则自己写的的对应的sql调用)这个储存就调用你们自己的
this.getBeanDao().saveInsert(lpCar, null, null);
/*直接提取xml数据*/
Element components = root.element("components");
int num = 0;
for (Iterator<Element> i = components.elementIterator(); i.hasNext();) {
num++;
Element component = i.next();
Map<String, String> datamap = new HashMap<String,String>();
datamap.put("part_code", component.elementText("spartNo").trim().replaceAll(" ", ""));
datamap.put("part_name", component.elementText("spartName").trim());
//用来生成数据库表的主键id
String id = UUID.randomUUID().toString().replaceAll("-", "");
log.info("id主键:"+id);
datamap.put("id", id);
//(这个是对应的框架储存数据库的方法,或则自己写的的对应的sql调用)这个储存就调用你们自己的
this.getBeanDao().saveInsertByMap(datamap, "lp_part",null);
}
return "<info>导入成功</info>";
}
/***
* 检查xml参数是否正确
* @param xml
* @param xsdName
* @return
*/
private String checkXml(String xml,String xsdName){
try{
if (xml == null || "".equals(xml)) {
return "<info>参数不能为空或参数名称错误</info>";
}else{
//验证参数格式
String path = LpEvaluationCarServiceImpl.class.getResource("").toURI().getPath();
String xsdFileName = path.substring(0,path.indexOf("/classes"))
+"/classes/xsd/"+xsdName;
if(!checkParam(xml,xsdFileName)){
return "<info>参数不正确,请检查参数!</info>";
}else{
return "success";
}
}
}catch (Exception e) {
e.printStackTrace();
return "<info>验证失败!</info>";
}
}
/**
* 检查xml参数格式是否正确
* @param xml 参数
* @param xsdFileName xsd文件
* @return
* @throws Exception
* @throws UnsupportedEncodingException
*/
@SuppressWarnings("unchecked")
private boolean checkParam(String xml, String xsdFileName) throws Exception {
SAXReader reader = new SAXReader();
Document doc = reader.read(new ByteArrayInputStream(xml.getBytes("UTF-8")));
Element element = doc.getRootElement();
//xmlns的值必须与xsd文件中的xmlns的值相同
StringBuffer sb = new StringBuffer("<"+element.getName()+" xmlns=\"http://www.w3school.com.cn\">");
for(Iterator<Element> i=element.elementIterator();i.hasNext();){
Element e = i.next();
sb.append(e.asXML());
}
sb.append("</"+element.getName()+">");
return XmlXsdValidator.checkXmlFormat(sb.toString(), xsdFileName);
}
/**
* 返回xml字符串的根节点
* @param xml
* @return
* @throws Exception
*/
private Element getRootElement(String xml) throws Exception {
SAXReader reader = new SAXReader();
Document doc = reader.read(new ByteArrayInputStream(xml
.getBytes("UTF-8")));
return doc.getRootElement();
}
}
测试方法(在单元测试或放在main方法中测试)
public String test throws Exception {
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" +
"<askinfo>\r\n" +
" <token>007</token>\r\n" +
" <platform>kuxin</platform>\r\n" +
" <vehicleinfo>\r\n" +
" <registNo>K001</registNo>\r\n" +
" <handlerCode>KX17</handlerCode>\r\n" +
" <handlerName>枯兴</handlerName>\r\n" +
" </vehicleinfo>\r\n" +
" <components>\r\n" +
" <component>\r\n" +
" <spartNo>L001</spartNo>\r\n" +
" <spartName>灰机</spartName>\r\n" +
" </component>\r\n" +
" </components>\r\n" +
"</askinfo>";
return this.importData(xml);
}
不足之处多多提点……