有道单词导入 有道单词 生词本 批量导入 添加 有道单词XML 背单词

 
 

本程序 主要功能:

对有道生词实现批量导入功能
 
生成有道单词XML的功能,实现快速导入
有了本程序后就可以批量添加生词。

有道生词本 XML模板

分析
word   为单词,可以为一个单词,也可以是词组,甚至语句也可以,中文也可以 单词中不能出现&否则无法导入成功
trans   解释   解释的内容写在这里
phonetic   音标  <![CDATA[这里写音标]]> , <![CDATA[]]> 这表示为空音标 
 
tags    分类  
progress   复习进度 0 如果为 -1表示未加入复习

 

如下所示 
 
<wordbook>
<item><word>This is a Test这是单词 或者 句子</word>
<trans><![CDATA[这是解释]]></trans>
<phonetic><![CDATA[这是音标]]></phonetic>
<tags>这是分类</tags>
<progress>0</progress>
</item>
</wordbook>

 

 
 
 
 
 
单行批量导入
一个单词 一个解释 全在一行
a === 1111
b===2222
...
多行批量导入
 
一个单词 多个解释 不在一行
a === 1111
空行空格没关系
ssfdsafa
a2dasd
b===2222
lllll
ssss
dddd
 
 
 
 

  

 
1) 是单词,可以是英文,短语,汉字都可以
2)单词对应的解释
3)是分割符号    默认用3个等号表示===,每行应该===左右的是单词右边的是解释
4)是单词类别,也就有道单词本的中分类
5)加入复习 ,-1未加入复习,0加入复习,它的上限是多少,我并不清楚,经们的范围也许是0-10也许是0-100
 

 

 

核心代码

 
生成一个单词的XML字符串  , 有道生词本 XML模板  

/// <summary>
/// 产生生成 有道单词 XML 的 格式文本  
/// </summary>
/// <param name="wordText">为单词,可以为一个单词,也可以是词组,甚至语句也可以,中文也可以</param>
/// <param name="translateText">解释的内容写在这里</param>
/// <param name="soundMark">这里写音标</param>
/// <param name="tags">分类</param>
/// <param name="review">复习进度,0为否,1为是</param>
/// <returns></returns>
public string GeneratYouDaoWordXml(string wordText, string translateText, string soundMark, string tags)
{
    StringBuilder sb = new StringBuilder();
    #region
 
    /*
        <wordbook>
        <item><word>This is a Test这是单词 或者 句子</word>
            <trans><![CDATA[这是解释]]></trans>
            <phonetic><![CDATA[这是音标]]></phonetic>
            <tags>这是分类</tags>
            <progress>0</progress>    
        </item>
        </wordbook>
        */
 
    ////确保这个 <wordbook>只出现一次
    #endregion
 
    sb.AppendFormat("    <item><word>{0}</word>\r\n", wordText);
    sb.AppendFormat("        <trans><![CDATA[{0}]]></trans>\r\n", translateText);
    sb.AppendFormat("        <phonetic><![CDATA[{0}]]></phonetic>\r\n", soundMark);
    sb.AppendFormat("         <tags>{0}</tags>\r\n", tags);
    sb.AppendFormat("         <progress>{0}</progress>\r\n", chBoxReview.Checked?0:-1);
    sb.AppendLine("    </item>");
           
    ////确保这个末尾 </wordbook>不重复添加
    return sb.ToString();
}
 
public string GeneratYouDaoWordXml(string wordText, string translateText, string tags)
{
    return GeneratYouDaoWordXml(wordText, translateText, "", tags);
}
 

循环分割单词和解释

将准备添加的单词放到textBox里面,如果格式正确的话,每行表示一个单词,然后循环生成XML字符串
 
生成完成后,保存为一个 XML文件,有道可以通过XML导入单词的

private void TranslateText()
{
    string wordText = "";
    string transText = "";
    string[] arr;
 
    string sText = fileText.Text;//要分析的文本
    string sOperator = textBox1.Text;// "==="; //文本中单词和解释之间的特征特号
 
    int line = 0;
    toolStripProgressBar1.Visible = true;
    try
    {
        toolStripProgressBar1.Minimum = 0;
        toolStripProgressBar1.Maximum = fileText.Lines.Length;
        string xml="";
        StringBuilder sb = new StringBuilder();
 
        for (int i = 0; i < fileText.Lines.Length; i++)
        {
            line = i;
            toolStripProgressBar1.Value = i;
 
            Application.DoEvents();
            sText = fileText.Lines[i];
            if (sText.IndexOf(sOperator) != -1)
            {
                arr = sText.Split(new string[] { sOperator }, StringSplitOptions.RemoveEmptyEntries);
                if (rbEn.Checked)
                {
                    wordText = arr[0].Trim();
                    transText = arr[1].Trim();
                }
                else// if(rbChs.Checked==true)
                {
                    wordText = arr[1].Trim();
                    transText = arr[0].Trim();
                }
 
                xml = GeneratYouDaoWordXml(wordText, transText, tags1.Text).Replace("&","");
                if(cboxView.Checked)
                {
                    if(xmlTxBox.Text.ToLower().IndexOf(xml.ToLower())==-1)
                        xmlTxBox.AppendText(xml);
                    else
                        error1.AppendText(string.Format("LN{0} :{1}存在",i,wordText));
                }
                else
                {
                    if (xmlTxBox.Text.ToLower().IndexOf(xml.ToLower()) == -1)
                        sb.Append(xml);
                    else
                        error1.AppendText(string.Format("LN{0} :{1}存在", i, wordText));
                }
            }
 
            //if (!cboxView.Checked)
        }
        if (!cboxView.Checked)
        {
            if (xmlTxBox.Text.ToLower().IndexOf(xml.ToLower()) == -1)
                xmlTxBox.AppendText(sb.ToString());
            else
                error1.AppendText(string.Format("LN{0} :{1}存在", line, wordText));
        }
                
    }
    catch (Exception ex)
    {
        tabControl1.SelectedIndex = 1;
                
        error1.AppendText("错误行: " + (line + 1).ToString() + "\t" + ex.Message + "\r\n");
        error1.AppendText(string.Format("提示: \r\n 从 第{0}行 到 第{1}行 内容并未处理! 请手动删除或修改的错误行,然后再试! \r\n  \t将TEXT里面的文本复制粘贴到记事本中,然后CTRL+G转到指定行!,然后将修改后的文本粘贴到TEXT中重新分析!\r\n", line+1, fileText.Lines.Length));
    }
          
    toolStripProgressBar1.Maximum = fileText.Lines.Length;
    toolStripProgressBar1.Visible = false;
}
 

 

 
 
 
 

处理单词文本时,用到的 正则 (程序中用不到)

http://regexr.com/

 

匹配空行

 
^[\s]*\n
 

去除每行的数字或者字母 

 
^(\w+)$
 
 

汉字

 
^[\u2E80-\u9FFF].*
 
 

一个英文单词后面跟一个空格,或者多个英文单词后面跟一个空格

 
^((,\s|\S)+)
 
  
 
 
 
 
 
 
 -------------------------------------------------------此处以下是给自己看的--------------------------------------------------------
 
[ 内容更新]
 
  2019年2月16日 16:53:00
 
这个功能支持多行了
像这如下格式,
一个单词==后面为多个解释,即使是多行也可以
 

 word1 === 后面放解释,
单词一定要符合下面这种格式的
单词的第2行解释 ...
单词的第n行解释

word2 === 后面放解释,
单词的第2行解释
...
单词的第n行解释
wordN === 后



释,
单词的第2
行解释 ...
单词的第n行解释

 



 

原理就是把多行转换成字符  _r_n_  变成 一个单词===一行解释

最后再把字符 换成\r\n

 

posted @ 2016-11-24 19:18 XE2011 阅读(...) 评论(...) 编辑 收藏