怎么用java把XML的字符串数据提取出来并存进数据库对应的字段

2 篇文章 0 订阅

来在开始之前我们把需要的几个工具先写好和xml的验证文件

  1. 创建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>

     

  2. 创建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>

     

  3. 创建一个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);
	}

不足之处多多提点……

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值