Найти и выбрать атрибут xml между двумя файлами с помощью PowerShell - PullRequest
1 голос
/ 10 июня 2011

У меня есть два XML-файла.

File1.xml:

<fileAsset fileAssetGuid="guid1" assetTitle="Title1" />
<fileAsset fileAssetGuid="guid2" assetTitle="Title2" />
<fileAsset fileAssetGuid="guid3" assetTitle="Title3" />

File2.xml:

<file id="guid1" />
<file id="guid2" />
<file id="guid3" />

Я знаю значение assetTitle в File1.xml ("Title1").Мне нужно использовать это значение, чтобы получить / выбрать значение fileAssetGuid ("guid1") в file1.xml.Затем мне нужно использовать значение ("guid1") fileAssetGuid в file1.xml, чтобы найти id ("guid1") в file2.xml.

Как мне это сделатьPowerShell?

Ответы [ 3 ]

2 голосов
/ 10 июня 2011

Используйте Xpath.

# Load up the XML 1. I've used here-string, but anything goes.
[xml]$x1 = @'
<root>
<fileAsset fileAssetGuid="guid1" assetTitle="Title1" />
<fileAsset fileAssetGuid="guid2" assetTitle="Title2" />
<fileAsset fileAssetGuid="guid3" assetTitle="Title3" />
</root>
'@

# Ditto for XML 2.
[xml]$x2 = @'
<root>
<file id="guid1" />
<file id="guid2" />
<file id="guid3" />
</root> 
'@

# Look for fileAsset element that has assettitle attribute
# which has value Title1
$n=$x1.SelectSinglenode("/root/fileAsset[@assetTitle='Title1']")

# Look for file node from XML2 that has id attribute
# that has value we got from XML1 with assetTitle 
$x2.SelectSingleNode("/root/file[@id=`"$($n.fileAssetGuid)`"]")

# Remove the node by calling its parent's RemoveChild()
$n2.ParentNode.RemoveChild($n2)

# View final XML on the console
$x2.Save([console]::out)
2 голосов
/ 10 июня 2011

Следующее должно делать то, что вы хотите (я добавил материал для иллюстративных целей):

PS D:\MiLu\Dev\PowerShell> cat .\xmlsel1.xml
<file1>
<fileAsset fileAssetGuid="guid1" assetTitle="Title1" />
<fileAsset fileAssetGuid="guid2" assetTitle="Title2" />
<fileAsset fileAssetGuid="guid3" assetTitle="Title3" />
</file1>
PS D:\MiLu\Dev\PowerShell> cat .\xmlsel2.xml
<file2>
<file id="guid1" data="one" />
<file id="guid2" data="two" />
<file id="guid3" data="three" />
</file2>
PS D:\MiLu\Dev\PowerShell> cat .\xmlsel.ps1
$doc1 = [xml](get-content xmlsel1.xml)
$title = "Title2"
$asset = $doc1.file1.fileAsset | where { $_.assetTitle -eq $title }
# echo $asset
# echo $asset.assetTitle
# echo $asset.fileAssetGuid

$doc2 = [xml](get-content xmlsel2.xml)
$file = $doc2.file2.file | where { $_.id -eq $asset.fileAssetGuid }
# echo $file
echo $file.data
PS D:\MiLu\Dev\PowerShell> .\xmlsel.ps1
two
1 голос
/ 10 июня 2011

В ответ на предложение Stej.

Select-Xml -Path "$pwd\file1.xml" -XPath "/root/fileAsset[@assetTitle]" | 
    ForEach {
        $id = $_.Node.fileAssetGuid
        Select-Xml -Path "$pwd\file2.xml" -XPath "/root/file[@id='$id']" | 
            ForEach { $_.Node }
    }

############
############

foreach( $assetGuideRecord in (Select-Xml -Path "$pwd\file1.xml" -XPath "/root/fileAsset[@assetTitle]") ) {
    $id = $assetGuideRecord.node.fileAssetGuid

    foreach( $record in (Select-Xml -Path "$pwd\file2.xml" -XPath "/root/file[@id='$id']") ) {
        $record.node
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...