攻城狮凌风

xml的解析与创建——bing到youdao导入文件的转换

        首先是为了解决一个问题:如何将必应单词本中记录的单词转入到有道词典中去。实际上,必应词典可以导出xml文件,但是该文件有道词典无法解析。这里涉及到xml的解析和创建了。

        代码如下:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class bing2youdao {
	private  String bingPath;//input filepath
	private String time;// filtering time (Default:current time)
	private String tag=null;
	final static String youdao="youdao.xml";//output file
	
	public bing2youdao(String filename){
		bingPath=filename;
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		time=sdf.format(new Date());
	}
	public bing2youdao(String filename,String d){
		bingPath=filename;
		time=d;
	}
	public bing2youdao(String filename,String d,String t){
		this(filename,d);
		tag=t;
	}
	
	
	public void run(){
		Node word=null;
		Node detail=null;
		String danci=null;
		String pronunciation=null;
		String definition=null;
		String data=null;
		try {
						
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
            DocumentBuilder builder = factory.newDocumentBuilder();  
            Document  document = builder.newDocument();  
			Element wordbook = document.createElement("wordbook");   //创建根节点  
            document.appendChild(wordbook);
			
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document dm = db.parse(new File(bingPath));//获得根元素
			Element bingWord = dm.getDocumentElement();
			NodeList wordList= bingWord.getChildNodes().item(1).getChildNodes();
			for (int i = 1; i < wordList.getLength(); i++) {
				   word = wordList.item(i);
			       NodeList nodeDetail = word.getChildNodes();
			       for (int j = 0; j < nodeDetail.getLength(); j++) {
			        	detail = nodeDetail.item(j);
			        	if ("Eng".equals(detail.getNodeName()))
			        		  danci=detail.getTextContent();
			            else if ("Phonetic".equals(detail.getNodeName()))
			            	  pronunciation=detail.getTextContent();
			            else if ("Defi".equals(detail.getNodeName()))
			            	  definition=detail.getTextContent();
			            else if("Date".equals(detail.getNodeName())) 
			            	  data=detail.getTextContent();	   
			       }
			       
			       //If the recorded time is after the filtering time than output it
			       if(timeDecision(data)&&nodeDetail.getLength()>0){
			    	   Element item= document.createElement("item"); 
			    	   
			    	   Element vacbulary= document.createElement("word"); 
			    	   vacbulary.appendChild(document.createTextNode(danci)); 
			    	   item.appendChild(vacbulary); 
			    	   
			    	   Element trans = document.createElement("trans"); 
			    	   trans.appendChild(document.createTextNode(definition)); 
			    	   item.appendChild(trans); 
			    	   
			    	   Element phonetic = document.createElement("phonetic"); 
			    	   phonetic.appendChild(document.createTextNode(pronunciation)); 
			    	   item.appendChild(phonetic);
			    	   Element tags = document.createElement("tags");
			    	   if(tag!=null)
			    	        tags.appendChild(document.createTextNode(tag)); 
			    	   item.appendChild(tags);
			    	   
			    	   Element progress = document.createElement("progress"); 
			    	   progress.appendChild(document.createTextNode(1+""));//复习进度,默认为1,可调为-1表示不加入复习计划
			    	   item.appendChild(progress); 
			    	   
			    	   wordbook.appendChild(item);
			       }
			}
			
			try {
			    TransformerFactory tf = TransformerFactory.newInstance();
	            Transformer transformer = tf.newTransformer();
	            DOMSource source = new DOMSource(document);
	            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
	            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
	            PrintWriter pw = new PrintWriter(new FileOutputStream(youdao));
	            StreamResult result = new StreamResult(pw);
	            transformer.transform(source, result);
	            System.out.println("【必应词典】转换为【有道词典】成功!");
	        } 
			catch (TransformerConfigurationException e) {
	            System.out.println(e.getMessage());
	        } 
			catch (IllegalArgumentException e) {
	            System.out.println(e.getMessage());
	        } 
			catch (FileNotFoundException e) {
	            System.out.println(e.getMessage());
	        } 
			catch (TransformerException e) {
	            System.out.println(e.getMessage());
	        }
			
	    }
		 catch (Exception ex) {
			 System.out.println(ex.getMessage());
		}
     }
	
	 //filtering function
	 private boolean timeDecision(String data){
		 if(data.compareTo(time)>=0)
		    return true;
		 else
		    return false;
				 
	 }
}




使用说明

      (1)将必应词典导出到本地文件“bing.xml”,放入工程根目录下。

      (2)定义 bing2youdao对象,可以使用三种构造函数: 

     new bing2youdao("bing.xml");
                new bing2youdao("bing.xml",“yyyy-mm-dd”);//表示仅仅转换“yyyy-mm-dd”(含)之后天数记录的单词
                new bing2youdao("bing.xml",“yyyy-mm-dd”,“newClass”);//表示将转换的单词归为“newClass”类

      (3)调用run()生成“youdao.xml”并将其导入到有道词典单词本即可。本例模式的复习进度为1,若希望其不加入复习计划,修改为“-1”即可

 

如:

	 public static void main(String args[]) {
		 bing2youdao jisuan= new bing2youdao("bing.xml","2015-10-21","CC");
		 jisuan.run();
	 }
     上例仅仅转换2015年10月21日后保存到必应词典中的单词,并将其统一归为“CC”类。



posted on 2015-10-27 22:09  攻城狮凌风  阅读(479)  评论(0编辑  收藏  举报

导航