Программа узел изменения атрибута


Я пытаюсь создать программу, которая будет искать файлы XML для узлов в виде <disp-formula id="deqnX-Y">создать словарь, где ключ-это как мпог="deqnX" ... мпог="deqnY", (где Х увеличивается на +1, пока не достигнет Г) и их стоимость, аналоги как избавиться="deqnX-м" в каждом, Тогда я могу просто сделать поиск и замену с использованием словаря для смены узлов связи. т. е. если файл имеет узлы, как <disp-formula id="deqn5-7">, <disp-formula id="deqn9-10">, <disp-formula id="deqn3a-3c">, <disp-formula id="deqn4p-5b"> и есть связать узлы в форме

<xref ref-type="disp-formula" rid="deqn5">
<xref ref-type="disp-formula" rid="deqn6">
<xref ref-type="disp-formula" rid="deqn10">
<xref ref-type="disp-formula" rid="deqn5c">

они должны быть изменены, чтобы

<xref ref-type="disp-formula" rid="deqn5-7">
<xref ref-type="disp-formula" rid="deqn5-7">
<xref ref-type="disp-formula" rid="deqn9-10">
<xref ref-type="disp-formula" rid="deqn4p-5b">

Я тоже хочу программу, чтобы игнорировать узлов, как <disp-formula id="deqn5-7c"> и/или <disp-formula id="deqn2a-4"> в файле.

Я использую ниже код

void Button1Click(object sender, EventArgs e)
{
    string active_filename = "";
    try
    {
        string[] path = Directory.GetDirectories(textBox1.Text, "xml", SearchOption.AllDirectories)
            .SelectMany(x => Directory.GetFiles(x, "*.xml", SearchOption.AllDirectories)).ToArray();
        Dictionary<string, string> dict = new Dictionary<string, string>();

        var pat = new Regex(@"^deqn(\d+([a-z]+)?)-(\d+(?(2)[a-z]+))$");
        foreach (var file in path)
        {
            File.Copy(file, file + ".bk", true);


            dict.Clear();
            active_filename = file;
            XDocument doc = XDocument.Load(file, LoadOptions.PreserveWhitespace);
            IEnumerable<XAttribute> list_of_elements = doc.Descendants("disp-formula").Where(z => (z.Attribute("id") != null) && pat.IsMatch(z.Attribute("id").Value)).Attributes("id");
            foreach (XAttribute ele in list_of_elements)
            {
                var m = Regex.Match((string)ele, pat.ToString());
                if (m.Success)
                {
                    var X = m.Groups[1].Value;
                    var Y = m.Groups[3].Value;
                    int Xi, Yi;
                    var isInt = int.TryParse(X, out Xi);
                    if (isInt)
                    {
                        //for deqnX-Y where both X and Y are integers
                        Yi = int.Parse(Y);
                        for (int i = Xi; i <= Yi; i++)
                            dict.Add("rid=\"deqn" + i + "\"", "rid=\"" + ele.Value + "\"");
                    }
                    else
                    {
                        //for deqnX-Y where both X and Y are a combination of integer-alphabet
                        char startCharacter = X.Substring(X.Length - 1)[0];
                        char endCharacter = Y.Substring(Y.Length - 1)[0];
                        int startNumber = int.Parse(X.Substring(0, X.Length - 1));
                        int endNumber = int.Parse(Y.Substring(0, Y.Length - 1));
                        string alphabet = "abcdefghijklmnopqrstuvwxyz";
                        for (int i = startNumber; i <= endNumber; ++i)
                        {
                            int currentCharEnd =
                                (i == endNumber) ? alphabet.IndexOf(endCharacter) : alphabet.Length - 1;
                            for (int j = alphabet.IndexOf(startCharacter); j <= currentCharEnd; ++j)
                            {
                                dict.Add("rid=\"deqn" + i.ToString() + alphabet[j] + "\"",
                                         "rid=\"deqn" + X.ToString() + "-" + Y.ToString() + "\"");
                            }
                            startCharacter = 'a';
                        }
                    }
                }



                string text = File.ReadAllText(file);
                foreach (KeyValuePair<string, string> element in dict)
                {
                    //do a search all replace all (search Key and replace by Value
                    text = text.Replace(element.Key, element.Value);
                }
                File.WriteAllText(file, text);


            }
        }
        MessageBox.Show("Done");
    }
    catch (Exception ex)
    {

        MessageBox.Show(string.Format(@"Error in file ({0}), below are the debug details: {1}", active_filename, ex.StackTrace.ToString()));
    }

Можно ли сделать программу более эффективной? Если да, то как я могу это сделать?

Изменение

foreach (KeyValuePair<string, string> element in dict)
{
text = text.Replace(element.Key, element.Value);
}

по

Parallel.ForEach(dict, element =>
{
    text = text.Replace(element.Key, element.Value);
} );

делают ли существенная разница?



114
1
c#
задан 11 февраля 2018 в 06:02 Источник Поделиться
Комментарии