Как найти значение атрибута XElement в нескольких файлах XML в C #? - PullRequest
0 голосов
/ 06 июня 2019

Мой XML-контент выглядит примерно так:

<p class="toc-title"><a id="page_5"></a>Inhoud</p>
<p class="toc-fm"><a href="___.html#foreword">Woord vooraf</a></p>
<p class="toc-fm"><a href="___.html#Inleiding">Inleiding: wat is verslaving?</a></p>
<p class="toc-ch"><a href="___.html#Chapter01"><span class="toc-num">1.&#x00A0;</span>Verslaving en leegte</a></p>
<p class="toc-h1"><a href="___.html#h1_1"><i>Eten</i></a></p>
<p class="toc-ch"><a href="___.html#Chapter02"><span class="toc-num">2.&#x00A0;</span>Zelfafwijzing en zelfveroordeling</a></p>
<p class="toc-h1"><a href="___.html#h1_2"><i>Social media</i></a></p>
<p class="toc-ch"><a href="___.html#Chapter03"><span class="toc-num">3.&#x00A0;</span>Beperking van je vrijheid</a></p>
<p class="toc-h1"><a href="___.html#h1_3"><i>Macht, aanzien en bezit</i></a></p>
<p class="toc-h1"><a href="___.html#h1_4"><i>Pornoverslaving</i></a></p>
<p class="toc-ch"><a href="___.html#Chapter04"><span class="toc-num">4.&#x00A0;</span>Verslaving en het brein</a></p>
<p class="toc-h1"><a href="___.html#h1_5"><i>Roken</i></a></p>
<p class="toc-ch"><a href="___.html#Chapter05"><span class="toc-num">5.&#x00A0;</span>Risicofactoren en beschermende factoren voor verslaving: uitdagingen voor de sociale en kerkelijke omgeving</a></p>
<p class="toc-h1"><a href="___.html#h1_6"><i>Gamen</i></a></p>
<p class="toc-ch"><a href="___.html#Chapter06"><span class="toc-num">6.&#x00A0;</span>Verslaving als psychiatrische stoornis: psychiatrische klachten in combinatie met verslavingsproblematiek</a></p>
<p class="toc-h1"><a href="___.html#h1_7"><i>Medicijnverslaving</i></a></p>
<p class="toc-ch"><a href="___.html#Chapter07"><a id="page_6"></a><span class="toc-num">7.&#x00A0;</span>Verslaving in het gezin</a></p>
<p class="toc-h1"><a href="___.html#h1_8"><i>Afhankelijkheid</i></a></p>
<p class="toc-ch"><a href="___.html#Chapter08"><span class="toc-num">8.&#x00A0;</span>Verslaving en geloof: wetenschappelijk onderzoek</a></p>
<p class="toc-h1"><a href="___.html#h1_9"><i>Alcohol</i></a></p>
<p class="toc-ch"><a href="___.html#Chapter09"><span class="toc-num">9.&#x00A0;</span>Is verslaving een ziekte?</a></p>
<p class="toc-h1"><a href="___.html#h1_10"><i>Drugs</i></a></p>
<p class="toc-ch"><a href="___.html#Chapter10"><span class="toc-num">10.&#x00A0;</span>Herstel in vier relaties: behandeling en begeleiding bij verslavingsproblematiek</a></p>
<p class="toc-h1"><a href="___.html#h1_11"><i>Woede en gekrenktheid</i></a></p>
<p class="toc-ch"><a href="___.html#Chapter11"><span class="toc-num">11.&#x00A0;</span>De man op de bank: aandachtspunten en valkuilen voor het pastoraat</a></p>
<p class="toc-h1"><a href="___.html#h1_12"><i>Gokken</i></a></p>
<p class="toc-bm"><a href="___.html#Literatuur">Geraadpleegde literatuur</a></p>
<p class="toc-bm"><a href="___.html#Personalia">Personalia</a></p>

У меня есть n файлов XML, варьирующихся от 15 до 350 файлов.Я хочу взять каждое значение атрибута <a href> в строке и найти его в Attribute("id"), если он есть, во всех файлах XML, включая этот.Если найден, я заменю ___ и поместу имя файла XML туда, где он найден.

Я сделал следующее, но это очень медленно.Не могли бы вы помочь мне быстрее?

Это мой код:

string pathFolder = TextBoxPath.Text;
DirectoryInfo directoryInfo = new DirectoryInfo(pathFolder);
string pathParent = directoryInfo.Parent.FullName;
string textFolder = Path.Combine(pathParent, "Text");
Regex filePattern = new Regex("\\d{13}");
if (ePUBv2CheckBox.IsChecked == true)
{
    fileFolder = pathFolder;
}
else
{
    fileFolder = textFolder;
}
string getISBNFile = Directory.GetFiles(fileFolder, "*.css", SearchOption.AllDirectories)
                           .Where(fileName => filePattern.IsMatch(Path.GetFileNameWithoutExtension(fileName))).FirstOrDefault();
string pathFileNameFolder = Path.GetFileNameWithoutExtension(getISBNFile);
List<string> getAllChapters = new List<string>();
List<string> getAllChaptersButThis = new List<string>();
if (ePUBv2CheckBox.IsChecked == true)
{
    getAllChapters = Directory.GetFiles(fileFolder, "*.html")
                                .Where(name => !(Path.GetFileName(name).Contains(pathFileNameFolder) || Path.GetFileName(name).ToLower().Contains("cover")))
                                .ToList();
}
else
{
    getAllChapters = Directory.GetFiles(fileFolder, "*.xhtml")
                                .Where(name => !(Path.GetFileName(name).ToLower().Contains("cover")))
                                .ToList();
}
foreach (var eachChapter in getAllChapters)
{
    string nameForSaving = Path.GetFileName(eachChapter);
    XDocument newChapter = XDocument.Load(eachChapter);
    XNamespace newNamespace = newChapter.Root.GetDefaultNamespace();
    List<XElement> hrefAttributes = newChapter.Descendants(newNamespace + "a")
                                       .Where(at => at.Attribute("href") != null
                                                && (at.Attribute("href").Value.Contains(".xhtml")
                                                 || at.Attribute("href").Value.Contains(".html")))
                                       .ToList();
    if (hrefAttributes.Count() > 0)
    {
        foreach (XElement hrefUnique in hrefAttributes)
        {
            string hrefValue = hrefUnique.Attribute("href").Value;
            string hrefLink = hrefValue.Substring(hrefValue.IndexOf("#") + 1);
            foreach (var anotherChapter in getAllChapters)
            {
                string fileName = Path.GetFileNameWithoutExtension(anotherChapter);
                fileName = fileName.Substring(fileName.IndexOf("_") + 1).Replace("_", String.Empty);
                XDocument temporaryDocument = XDocument.Load(anotherChapter);
                foreach (XElement breakChapter in temporaryDocument.Descendants())
                {
                    List<XElement> getListID = breakChapter.Descendants().Where(at => at.Attribute("id") != null
                                                                                       && at.Attribute("id").Value.Equals(hrefLink, StringComparison.InvariantCultureIgnoreCase))
                                                                        .ToList();
                    if (getListID.Count() > 0 || fileName.Equals(hrefLink, StringComparison.InvariantCultureIgnoreCase))
                    {
                        string getChapterFile = getAllChapters.FirstOrDefault(ch => Path.GetFileName(ch)
                                                        .Contains(fileName));
                        hrefUnique.SetAttributeValue("href", Path.GetFileName(getChapterFile) + "#" + hrefLink);
                        break;
                    }
                }
                newChapter.Save(fileFolder + "\\" + nameForSaving);
            }
        }
    }
}

1 Ответ

0 голосов
/ 11 июня 2019

Если цель состоит в том, чтобы просто обновить все элементы <a>, которые имеют атрибуты href, начиная с "___", просто найдите эти элементы и обновите значения атрибутов. Я не уверен, что вы делаете с остальной частью этого кода, но все, что вам нужно, это что-то вроде этого:

void UpdateFile(string path)
{
    var doc = XDocument.Load(path);
    var filename = Path.GetFileNameWithoutExtension(path);
    foreach (var a in doc.XPathSelectElements("//a[starts-with(@href, '___.')]"))
    {
        var href = a.Attribute("href");
        href.Value = href.Value.Replace("___", filename);
    }
    doc.Save(path);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...