Скрипт Powershell для получения части содержимого узла XML - PullRequest
0 голосов
/ 04 октября 2018

Как я могу получить только часть текста узла XML?

У меня есть этот фрагмент XML:

  <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>

Мне нужно извлечь только один фрагмент текста в каждом:

../Metadata

../desano-silva-0151/Metadata

У меня есть этот код:

$j = 0
$TrgContent.METATRANSCRIPT.Corpus.CorpusLink | ForEach-Object {
[String]$_.'#text'= % {$alltext[$j] + "xml" $j++}}

Но он дает мне весь текст:

../Metadata/A_short_autobiography_of_Herculino_Alves.xml

../desano-silva-0151/Metadata/Wordlist_fruits_and_cultural_items.xml

Заранее благодарен за любую помощь.

1 Ответ

0 голосов
/ 04 октября 2018

Для достижения того, что вы просили.Я думаю, что у нас есть два основных шага:

  1. Извлечение содержимого узлов XML.
  2. Обрежьте содержимое и возьмите только то, что вам нужно.

Я не очень знаком с вашими существующими сценариями, поэтому я объясню все два шага здесь.Первый шаг необязателен для вас.

Извлечение содержимого узлов 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 `/`

Я подразумеваю, что структура этих строк стабильна, поэтому регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...