Заменить значения XML в одном XML из другого документа XML-массив значений узлов с помощью PowerShell - PullRequest
0 голосов
/ 29 сентября 2018

У меня проблемы с заменой значений в документах XML.

У меня есть эти два фрагмента xml:

XmlFile_1

<CorpusLink ArchiveHandle="hdl:2196/00-0000-0000-000F-72B3-8" Name="     ">../Metadata/A_short_autobiography_of_Herculino_Alves.imdi</CorpusLink>
<CorpusLink ArchiveHandle="hdl:2196/00-0000-0000-000F-72B5-E" Name=" tttttt    ">../Metadata/Wordlist_and_phrases_-_modifiers.imdi</CorpusLink>

<CorpusLink ArchiveHandle="hdl:2196/00-0000-0000-000F-72B9-6" Name=" hhhhhh    ">../desano-silva-0151/Metadata/The_Turtle_and_the_Deer.imdi</CorpusLink>
<CorpusLink ArchiveHandle="hdl:2196/00-0000-0000-000F-72BB-1" Name=" jjjjjj    ">../desano-silva-0151/Metadata/Wordlist_and_phrases_parts_of_a_tree.imdi</CorpusLink>
<CorpusLink ArchiveHandle="hdl:2196/00-0000-0000-000F-72BD-B" Name=" kkkkk    ">../desano-silva-0151/Metadata/Wordlist_and_phrases_.imdi</CorpusLink>

XMLFile2

<Session>
  <Name>des2008_002_ab</Name>

Мне нужно заменить значение каждого «CorpusLink.Name» в Xmlfile_1 на значение в Session.Name в XmlFile_2; XmlFile_3; XmlFile_4; XmlFile_5; XmlFile_5, если у меня есть несколько XML-документов, таких как XmlFile_2.

По сути, идея состоит в том, чтобы заменить значения следующим образом

xmldoc1.Corpuslink.Name = xmldoc2.Session.Name
xmldoc1.Corpuslink.Name = xmldoc3.Session.Name                  
xmldoc1.Corpuslink.Name = xmldoc4.Session.Name
xmldoc1.Corpuslink.Name = xmldoc5.Session.Name                       
...

Пока у меня есть этот код:

$Targfiles = Get-ChildItem C:\WorkingFolder\ *.xml
$TrgContent = [xml](Get-Content $Targfiles)

$Sourcfiles = New-Object System.Collections.ArrayList;
$Sourcfiles = Get-ChildItem C:\WorkingFolder\Source\*.xml
$SrcContent = Foreach ($item in $Sourcfiles){[xml] (Get-Content $item)}

$TrgContent.METATRANSCRIPT.Corpus.CorpusLink | ForEach-Object {[String]$_.Name= Foreach ($element in $SrcContent)    {$element.METATRANSCRIPT.Corpus.CorpusLink}}

$OutputFile=$Targfiles.Name
$TrgContent.Save("C:\WorkingFolder\output\$OutputFile")

Код работает, но я не могу получитьрезультат, который мне нужен, это моя проблема:

$TrgContent.METATRANSCRIPT.Corpus.CorpusLink | ForEach-Object {[String]$_.Name= Foreach ($element in $SrcContent){$element.METATRANSCRIPT.Corpus.CorpusLink}}

РЕЗУЛЬТАТ:

<CorpusLink ArchiveHandle="hdl:2196/00-0000-0000-000F-72B3-8" Name="     ">../Metadata/A_short_autobiography_of_Herculino_Alves.imdi</CorpusLink>
<CorpusLink ArchiveHandle="hdl:2196/00-0000-0000-000F-72B5-E" Name="     ">../Metadata/Wordlist_and_phrases_-_modifiers.imdi</CorpusLink>
<CorpusLink ArchiveHandle="hdl:2196/00-0000-0000-000F-72B7-9" Name="     ">../desano-silva-0151/Metadata/Wordlist_fruits_and_cultural_items.imdi</CorpusLink>

<CorpusLink ArchiveHandle="hdl:2196/00-0000-0000-000F-72B9-6" Name="     ">../desano-silva-0151/Metadata/The_Turtle_and_the_Deer.imdi</CorpusLink>

<CorpusLink ArchiveHandle="hdl:2196/00-0000-0000-000F-72BD-B" Name="     ">../desano-silva-0151/Metadata/Wordlist_and_phrases_.imdi</CorpusLink>

Значения в CorpusLink.Name пусты.Как я могу решить эту проблему?

Заранее спасибо

1 Ответ

0 голосов
/ 29 сентября 2018

Вы присваиваете значение из того же тега, но для типизации string также не требуется.Попробуйте ниже.

$i = 0
$TrgContent.METATRANSCRIPT.Corpus.CorpusLink | ForEach-Object {
    $_.Name= $SrcContent[$i].Session.Name.'#text'
    $i++
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...