Синтаксический анализ XML значений узла для экспорта в CSV - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь получить значение "location path =", "allowUnlisted" и всех IP-адресов, чтобы я мог экспортировать их в csv.

Пример XML

<configuration> 
 <location path="Example/5192_proxy">
        <system.webServer>
            <security>
                <ipSecurity allowUnlisted="false">
                    <add ipAddress="10.10.100.0" subnetMask="255.255.252.0" allowed="true" />
                    <add ipAddress="10.10.48.0" subnetMask="255.255.240.0" allowed="true" />
                    <add ipAddress="10.10.100.0" subnetMask="255.255.252.0" allowed="true" />
                    <add ipAddress="192.168.63.97" subnetMask="255.255.255.224" allowed="true" />
                </ipSecurity>
            </security>
        </system.webServer>
    </location>
    <location path="Example/3796_Proxy">
        <system.webServer>
            <security>
                <ipSecurity allowUnlisted="false">
                    <add ipAddress="192.168.30.52" allowed="true" />
                    <add ipAddress="10.10.48.0" subnetMask="255.255.240.0" allowed="true" />
                </ipSecurity>   
               </security>
        </system.webServer>
    </location>
</configuration>

Это то, что у меня до сих пор, это бросать несколько чисел в поле «ExampleCLient»

$snippet.configuration.location."system.WebServer".security.ipSecurity |select @{L="ExampleClient";E={$snippet.configuration.location.path}}, allowUnlisted, add -ExpandProperty add

В конечном итоге я бы хотел, чтобы это читалось как

ExampleClient   AllowUnlisted  IPAddress
Example/5192       False       10.10.100.0
Example/5192       False       10.10.48.0
...
Example/3796_Proxy False       192.168.30.52

Править :

Это работает несколько, я думаю, я понял!

[xml]$xml = (Get-Content .\Sample.xml)
$finum = $($xml.configuration.location.path)
FOREACH ($fi in $finum) 
 {
  $xml.configuration.location."system.webServer".security.ipSecurity |select allowUnlisted, add -ExpandProperty add |select @{L="FI";E={$fi}}, allowunlisted, ipaddress, subnetmask
 }

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Это звучит как работа для запроса XPath или 3!

В приведенном ниже примере мы:

  1. Найдите любые <add ipAddress="..."> узлы в документ //add[@ipAddress]
  2. Выберите значение «ExampleClient» из первого <location> предка ./ancestor::location
  3. Аналогично выберите значение «AllowUnlisted» из первого <ipSecurity> предка ./ancestor::ipSecurity
$ipNodes = $snippet.SelectNodes('//add[@ipAddress]')

$ipNodes |Select-Object @{Name='ExampleClient';E={$_.SelectSingleNode('./ancestor::location').path}},@{Name='AllowUnlisted';E={[bool]::Parse($_.SelectSingleNode('./ancestor::ipSecurity').allowUnlisted)}},ipAddress 
1 голос
/ 04 марта 2020

Вы можете сделать это, как показано ниже:

[xml]$snippet = @"
<configuration> 
 <location path="Example/5192_proxy">
        <system.webServer>
            <security>
                <ipSecurity allowUnlisted="false">
                    <add ipAddress="10.10.100.0" subnetMask="255.255.252.0" allowed="true" />
                    <add ipAddress="10.10.48.0" subnetMask="255.255.240.0" allowed="true" />
                    <add ipAddress="10.10.100.0" subnetMask="255.255.252.0" allowed="true" />
                    <add ipAddress="192.168.63.97" subnetMask="255.255.255.224" allowed="true" />
                </ipSecurity>
            </security>
        </system.webServer>
    </location>
    <location path="Example/3796_Proxy">
        <system.webServer>
            <security>
                <ipSecurity allowUnlisted="false">
                    <add ipAddress="192.168.30.52" allowed="true" />
                    <add ipAddress="10.10.48.0" subnetMask="255.255.240.0" allowed="true" />
                </ipSecurity>   
               </security>
        </system.webServer>
    </location>
</configuration>
"@

$result = $snippet.configuration.location | ForEach-Object {
    $client        = $_.path
    $allowUnlisted = $_.'system.WebServer'.security.ipSecurity.allowUnlisted
    foreach ($ip in $_.'system.WebServer'.security.ipSecurity.add.ipAddress) {
        [PsCustomObject]@{
            ExampleClient = $client 
            AllowUnlisted = $allowUnlisted
            IPAddress     = $ip
        }
    }
}

# output on screen
$result

# output to CSV file
$result | Export-Csv -Path 'D:\config.csv' -NoTypeInformation

Результат на экране:

ExampleClient      AllowUnlisted IPAddress    
-------------      ------------- ---------    
Example/5192_proxy false         10.10.100.0  
Example/5192_proxy false         10.10.48.0   
Example/5192_proxy false         10.10.100.0  
Example/5192_proxy false         192.168.63.97
Example/3796_Proxy false         192.168.30.52
Example/3796_Proxy false         10.10.48.0


В соответствии с вашим комментарием, вы также хотели бы чтобы включить маску подсети, необходимо немного изменить внутренний foreach l oop:
$result = $snippet.configuration.location | ForEach-Object {
    $client        = $_.path
    $allowUnlisted = $_.'system.WebServer'.security.ipSecurity.allowUnlisted
    foreach ($item in $_.'system.WebServer'.security.ipSecurity.add) {
        [PsCustomObject]@{
            ExampleClient = $client 
            AllowUnlisted = $allowUnlisted
            IPAddress     = $item.ipAddress
            SubnetMask    = $item.subnetMask
        }
    }
}

Результат:

ExampleClient      AllowUnlisted IPAddress     SubnetMask     
-------------      ------------- ---------     ----------     
Example/5192_proxy false         10.10.100.0   255.255.252.0  
Example/5192_proxy false         10.10.48.0    255.255.240.0  
Example/5192_proxy false         10.10.100.0   255.255.252.0  
Example/5192_proxy false         192.168.63.97 255.255.255.224
Example/3796_Proxy false         192.168.30.52                
Example/3796_Proxy false         10.10.48.0    255.255.240.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...