繁体   English   中英

从API提取XML并将其存储在本地的最有效方法是什么?

[英]What is the most efficient way to take XML from API and store it locally?

我正在尝试找到从merriam webster字典中读取XML并将其存储到本地文件以供以后使用的最快方法。 下面,我尝试实现一个执行以下操作的模块:

  1. 从本地目录读取2000个单词
  2. 使用API​​查找merriam词典中的每个单词
  3. 将定义存储在本地XML中供以后使用。

我不确定制作XML是否是存储此数据的最佳方法,但这似乎是最简单的事情。 起初,我以为我会以不同的步骤来做。 (1.查找单词,将单词和定义存储到数据结构中。2.将所有数据转储到XML中。)但是,这带来了一个问题,因为它太多的东西无法存储在运行时(调用)堆栈中。

因此,在这种情况下,我尝试通过查找每个单词然后将其逐个保存到xml来加快处理速度。 但是,这也是一种缓慢的方法。 每500-600个字使我花费大约10分钟。

public void load_module() // stores words/definitions into xml file
    { // 1. Pick up word from text file     2. Look up word's definition    3. Store in Xml 
        string workdirect = Directory.GetCurrentDirectory();
        workdirect = workdirect.Substring(0, workdirect.LastIndexOf("bin"));
        workdirect += "words1.txt";
        using (StreamReader read = new StreamReader(workdirect)) // 1. Pick up word from text file 
        {
            while (!read.EndOfStream)
            {
                string line = read.ReadLine(); 
                var definitions = load(line.ToLower());    // 2. Retrieve Words Definitions

                store_xml(line, definitions);
                wordlist.Add(line);
            }
        }
    }

    public List<string> load(string word)
    {
        XmlDocument doc = new XmlDocument();

        List<string> definitions = new List<string>();
        XmlNodeList node = null;

        doc.Load("http://www.dictionaryapi.com/api/v1/references/collegiate/xml/"+word+"?key=*****************"); // Asteriks to hide the actual API key

        if (doc.SelectSingleNode("entry_list").SelectSingleNode("entry").SelectSingleNode("def") == null)
        {
            return definitions;
        }
        node = doc.SelectSingleNode("entry_list").SelectSingleNode("entry").SelectSingleNode("def").SelectNodes("dt");

        // TO DO : implement definitions if there is no node "def" in first node entry "entry_list"

        foreach (XmlNode item in node)
        {
            definitions.Add(item.InnerXml.ToString().ToLower());
        }


        return definitions;

    }

    public void store_xml(string word, List<string> definitions)
    {
        string local = Directory.GetCurrentDirectory();
        string name = "dictionary_word.xml";
        local = local.Substring(0, local.LastIndexOf("bin"));
        bool exists = File.Exists(local + name);

        if (exists)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(local + name);
            XmlElement wordindoc = doc.CreateElement("Word");
            wordindoc.SetAttribute("xmlns", word);
            XmlElement defs = doc.CreateElement("Definitions");
            foreach (var item in definitions)
            {
                XmlElement def = doc.CreateElement("Definition");
                def.InnerText = item;
                defs.AppendChild(def);
            }
            wordindoc.AppendChild(defs);
            doc.DocumentElement.AppendChild(wordindoc);
            doc.Save(local+name);
        }
        else
        {
            using (XmlWriter writer = XmlWriter.Create(@local + name))
            {
                writer.WriteStartDocument();

                writer.WriteStartElement("Dictionary");

                writer.WriteStartElement("Word", word);

                writer.WriteStartElement("Definitions");
                foreach (var def in definitions)
                {
                    writer.WriteElementString("Definition", def);
                }
                writer.WriteEndElement();
                writer.WriteEndElement();

                writer.WriteEndElement();
                writer.WriteEndDocument();
            }
        }           
    }
}

当处理大量需要导出到XML的数据时,我通常将数据作为自定义对象的集合而不是XMLDocument保留在内存中:

public class Definition
{
    public string Word { get; set; }
    public string Definition { get; set; }
}

然后,我将使用XMLWriter将集合写入XML文件:

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = ("    ");
settings.Encoding = Encoding.UTF8;
using (XmlWriter writer = XmlWriter.Create("C:\output\output.xml", settings))
{
    writer.WriteStartDocument();
    // TODO - use XMLWriter functions to write out each word and definition
    writer.Flush();
}

如果仍然缺少内存,则可以批量写出XML(例如,每500个定义)。

我发现有关改善XML性能的Microsoft文章是非常有用的参考,特别是有关“设计注意事项”的部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM