Фильтрация данных XML в Powershell и сохранение в целевую папку в том же формате XML - PullRequest
0 голосов
/ 30 марта 2019

У меня есть XML-файл, который содержит данные для разных стран. Я хочу загрузить XML-файл с помощью PowerShell, отфильтровать данные, чтобы просто показать данные для Великобритании, а затем сохранить результат в новом XML-файле. Я могу загрузить данные, отфильтровать их, но не сохранить. После фильтрации данных 2 верхних узла (набор данных и данные) не видны в целевой переменной.

Я попытался загрузить файл с помощью Get-Content, отфильтровал данные, используя "$ xml.dataset.data | Where {$ _. Country.startsWith (" UK ")}", а затем использовал ".save" для сохранения результат.

Ниже мой XML:

<?xml version="1.0" encoding="utf-8"?>
<dataset>
    <data>
        <Name>Test1</Name>
        <Description>First test in the set</Description>
        <FilePath4>C:\Application\Apple.txt</FilePath4>
        <country>UK</country>
        <FilePath7>C:\Test\Orange.txt</FilePath7>
    </data>
    <data>
        <Name>Test1</Name>
        <Description>Third test in the set</Description>
        <FilePath4>C:\Application\Apple.txt</FilePath4>
        <country>ROI</country>
        <FilePath7>C:\Test\Orange.txt</FilePath7>
    </data>
</dataset>

Загрузка данных: $xml = [System.Xml.XmlDocument](Get-Content C:\Users\HybridPC-40\Desktop\Sample.xml)

Фильтр данных: $xml1 = $xml.dataset.data | Where {$_.country.startsWith("UK")}

Результат: $xml1 дает

Name        : Test1
Description : First test in the set
FilePath4   : C:\Application\Apple.txt
country     : UK
FilePath7   : C:\Test\Orange.txt

Сохранение: $xml1.save("C:\Users\HybridPC-40\Desktop\Test.xml") дает ниже ошибку

Method invocation failed because [System.Xml.XmlElement] does not contain a method named 'save'.
At line:1 char:1
+ $xml1.save("C:\Users\HybridPC-40\Desktop\Test.xml")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (save:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

Ожидаемый результат должен быть новый файл XML с данными ниже:

<?xml version="1.0" encoding="utf-8"?>
<dataset>
    <data>
        <Name>Test1</Name>
        <Description>First test in the set</Description>
        <FilePath4>C:\Application\Apple.txt</FilePath4>
        <country>UK</country>
        <FilePath7>C:\Test\Orange.txt</FilePath7>
    </data>
</dataset>

Ответы [ 4 ]

0 голосов
/ 31 марта 2019

Как насчет этого ...

[xml]$Country = @"
<?xml version="1.0" encoding="utf-8"?>
<dataset>
    <data>
        <Name>Test1</Name>
        <Description>First test in the set</Description>
        <FilePath4>C:\Application\Apple.txt</FilePath4>
        <country>UK</country>
        <FilePath7>C:\Test\Orange.txt</FilePath7>
    </data>
    <data>
        <Name>Test1</Name>
        <Description>Third test in the set</Description>
        <FilePath4>C:\Application\Apple.txt</FilePath4>
        <country>ROI</country>
        <FilePath7>C:\Test\Orange.txt</FilePath7>
    </data>
</dataset>
"@

$Country.dataset.data 

# Results

Name        : Test1
Description : First test in the set
FilePath4   : C:\Application\Apple.txt
country     : UK
FilePath7   : C:\Test\Orange.txt

Name        : Test1
Description : Third test in the set
FilePath4   : C:\Application\Apple.txt
country     : ROI
FilePath7   : C:\Test\Orange.txt


($NonUK = $Country.dataset.data | Where-Object {$_.Country -ne 'UK'})

# Results

Name        : Test1
Description : Third test in the set
FilePath4   : C:\Application\Apple.txt
country     : ROI
FilePath7   : C:\Test\Orange.txt

$Country.dataset.RemoveChild($NonUK)

# Results

Name        : Test1
Description : Third test in the set
FilePath4   : C:\Application\Apple.txt
country     : ROI
FilePath7   : C:\Test\Orange.txt


# Results

$Country.Save('e:\temp\UK_Only.xml')

Get-Content -Path 'E:\temp\UK_Only.xml'

# Results

<?xml version="1.0" encoding="utf-8"?>
<dataset>
  <data>
    <Name>Test1</Name>
    <Description>First test in the set</Description>
    <FilePath4>C:\Application\Apple.txt</FilePath4>
    <country>UK</country>
    <FilePath7>C:\Test\Orange.txt</FilePath7>
  </data>
</dataset>
0 голосов
/ 30 марта 2019
#creates a record of all or part of a PowerShell session to a text file. 
#The transcript includes all command that the user types and all output that appears on the console.
Start-Transcript -Path "$PSScriptRoot\Log\$($($MyInvocation.MyCommand.Name).TrimEnd("ps1"))log"


$XmlPath = "$PSScriptRoot\Sample.xml"
# same too below ..
#$XmlPath = Join-Path -Path $PSScriptRoot -ChildPath "Sample.xml"

$SavedNewXml = "$PSScriptRoot\Test.xml"


$xml = [xml](Get-Content $XmlPath)
#$xml = [System.Xml.XmlDocument](Get-Content $XmlPath)

$xml1 = $xml.dataset.data | Where {$_.country.startsWith("UK")}


$xml1 | ForEach-Object {
    Write-host "Writing to $SavedNewXml  ..."
    $_ | Out-File -FilePath $SavedNewXml
}

#stops a transcript that was started by the Start-Transcript cmdlet. 
#Alternatively, you can end a session to stop a transcript.
Stop-Transcript
0 голосов
/ 31 марта 2019

Удалите узлы данных, кроме целевого узла, и сохраните их.

$xml.SelectNodes("//data[not(./country/@value='UK')]") | foreach { $_.ParentNode.RemoveChild($_) }
$xml.Save("your xml path")
0 голосов
/ 30 марта 2019

xmlelement, поскольку ошибка предполагает, что у dosent есть метод save, xmldocument, который его содержит.

попробуйте это:

$xml1.ownerdocument.save("C:\Users\HybridPC-40\Desktop\Test.xml")

несколько советов:

загрузка xml

$xml = new-object System.Xml.XmlDocument
$xml.load("C:\Users\HybridPC-40\Desktop\Sample.xml")

использование get-content для загрузки xml может привести к путанице при форматировании.

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