Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PowerShell3.0逐个解析XML中的行_Xml_Powershell_Powershell 3.0 - Fatal编程技术网

使用PowerShell3.0逐个解析XML中的行

使用PowerShell3.0逐个解析XML中的行,xml,powershell,powershell-3.0,Xml,Powershell,Powershell 3.0,我正在尝试使用PowerShell3.0逐个解析xml标记下的内容,但无法以所需的方式进行解析。 XML如下所示 <entry> <path>C:\Users\Admin\Uploads</path> <file>upload.exe</file> <path>C:\Users\Admin\Downloads</path><file>download.exe</file>

我正在尝试使用PowerShell3.0逐个解析xml标记下的内容,但无法以所需的方式进行解析。 XML如下所示

<entry>
    <path>C:\Users\Admin\Uploads</path> <file>upload.exe</file>
    <path>C:\Users\Admin\Downloads</path><file>download.exe</file>
    <path>C:\Users\Admin\Documents</path><file>log_file.log</file>
</entry>
xml文件的名称是new.xml。我使用以下代码在每次迭代中只打印一个路径及其相应的文件

$new = Get-Content .\new.xml
$new = [xml]$new
foreach($item in $new.entry){
    $item.path
    $item.file
}
但我得到的结果是:

C:\Users\Admin\Uploads
C:\Users\Admin\Downloads
C:\Users\Admin\Documents
upload.exe
download.exe
log_file.exe
我甚至尝试过像这样编辑XML文件:

<entry>
<details>
    <path>C:\Users\Admin\Uploads</path> <file>upload.exe</file>
</details>
<details>
    <path>C:\Users\Admin\Downloads</path><file>download.exe</file>
</details>
<details>
    <path>C:\Users\Admin\Documents</path><file>log_file.log</file>
</details>
</entry>
$xml = [xml](gc .\new2.xml)
$xml.entry.details | foreach { $_.path, $_.file }

然后尝试分别解析路径及其文件,但即使这样也没有帮助。我哪里做错了?是否有一种方法可以在每次迭代中解析一个路径及其相应的文件。

在XML中,路径和file元素之间没有关系。它们只是列在同一级别的条目下

$new = Get-Content .\new.xml
$new = [xml]$new
foreach($item in $new.entry){
    $item.path
    $item.file
}
但请注意,这是脆弱的,输出取决于子节点的顺序。这是一种糟糕的做法。第二个XML更好,因为它清楚地表达了路径和文件之间的关系。然后,您可以轻松地处理每个细节元素,如下所示:

foreach($d in $new2.entry.ChildNodes){
    echo "The file '$($d.file)' is located at the following path: $($d.path)"
}

假设xml中的文件和路径可能始终相同,则可以执行以下操作:

$xml = [xml](gc .\new.xml)
$count = $xml.entry.file.Count
if ($count -ne $xml.entry.path.Count) {
    Write-Warning "Mismatched file and path elements. Found $($xml.entry.path.Count) paths and $count files."
}
for($i = 0; $i -lt $count; $i += 1) {
    $xml.entry.path[$i]
    $xml.entry.file[$i]
}
第二个xml更简单,因为结构清晰。您可以这样做:

<entry>
<details>
    <path>C:\Users\Admin\Uploads</path> <file>upload.exe</file>
</details>
<details>
    <path>C:\Users\Admin\Downloads</path><file>download.exe</file>
</details>
<details>
    <path>C:\Users\Admin\Documents</path><file>log_file.log</file>
</details>
</entry>
$xml = [xml](gc .\new2.xml)
$xml.entry.details | foreach { $_.path, $_.file }

相同数量的path和file元素不能保证它们的顺序是一致的。OP的第二个XML确实是最好的选择。@mike z:是的,在某些情况下,我只有路径,但其中没有文件,所以第一个不起作用。第二种XML要好得多,因此我将继续使用它。非常感谢您的回复:谢谢:这帮了大忙。第二个XML可能是更好的设计,但我不知道如何进一步进行。