Для достижения того, что вы просили.Я думаю, что у нас есть два основных шага:
- Извлечение содержимого узлов XML.
- Обрежьте содержимое и возьмите только то, что вам нужно.
Я не очень знаком с вашими существующими сценариями, поэтому я объясню все два шага здесь.Первый шаг необязателен для вас.
Извлечение содержимого узлов XML
Мой пример XML-документа:
<Corpus>
<CorpusLink>../Metadata/A_short_autobiography_of_Herculino_Alves.xml</CorpusLink>
<CorpusLink>../Metadata/Wordlist_and_phrases_-_modifiers.xml</CorpusLink>
<CorpusLink>../desano-silva-0151/Metadata/Wordlist_fruits_and_cultural_items.xml</CorpusLink>
<CorpusLink>../desano-silva-0151/Metadata/The_Turtle_and_the_Deer.xml</CorpusLink>
<CorpusLink>../desano-silva-0151/Metadata/Wordlist_and_phrases_parts_of_a_tree.xml</CorpusLink>
<CorpusLink>../desano-silva-0151/Metadata/Wordlist_and_phrases_.xml</CorpusLink>
</Corpus>
PS-скрипт для получения содержимого:
[xml] $XmlDocument = Get-Content D:\Path_To_Your_File
$XmlDocument.Corpus.CorpusLink # Content of the nodes you need
Обрезка содержимого
Есть много методов, но я думаю, что я буду использовать регулярные выражения.Просто переберите все содержимое и запустите регулярное выражение.
$XmlDocument2.Corpus.CorpusLink | Foreach-Object {
if ($_ -match "\.\.\/.*?\/") {
$Matches.Values
}
}
Что касается регулярного выражения, оно соответствует любому символу, кроме ограничителей строки между ..\
и /
:
\.\. # Escape for 2 dots `..`
\/ # Escapefor slash `/`
.*? # Takes any character except for line terminators in between other listed characters (above and below)
\/ # Escape for slash `/`
Я подразумеваю, что структура этих строк стабильна, поэтому регулярное выражение.