首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell XML解析器在子节点上不起作用

Powershell XML解析器在子节点上不起作用
EN

Stack Overflow用户
提问于 2010-07-21 20:34:44
回答 5查看 9.6K关注 0票数 1

我正在尝试解析以下文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?> 
<printDrivers>
    <printDriver id="XE8550">
    <inf>x28550p.inf</inf>
    <driverPath>\drivers\XEROX\8550\8550_Driver</driverPath>
    <printerPaths>
            <printerPath>\\print-man\man-25</printerPath>
        </printerPaths>
    </printDriver>
    <printDriver id="HP4050TN">
        <inf>hpbf002i.inf</inf>
        <driverPath>\drivers\HP\LaserJet\LaserJet_4050_PCL6</driverPath>
        <printerPaths>
            <printerPath>\\print-man\man-8</printerPath>
            <printerPath>\\print-man\man-14</printerPath>
        </printerPaths>
    </printDriver>
  </printDrivers>

使用以下powershell脚本:

代码语言:javascript
复制
$nodelist = $xd.selectnodes("/printDrivers/printDriver") # XPath is case sensitive
foreach ($printerDriverNode in $nodelist) {
    $XMLid = $printerDriverNode.getAttribute("id")
    $XMLinf = $printerDriverNode.selectSingleNode("inf").get_innerXml()
    $XMLdriverPath = $printerDriverNode.selectSingleNode("driverPath").get_innerXml()
    $printerPathNodeList = $printerDriverNode.selectNodes("printerPaths/printerPath")
        foreach ($printerPathNode in $printerPathNodeList) {
            $XMLprinterPath = $printerPathNode.selectSingleNode("printerPath").get_innerXml()
        }
}

除了“嵌套”节点之外,一切都运行得很好。当我运行脚本时,它只得到第一个。也就是说,它不会得到\print-man\man-14,只会得到\print-man\man-8。

如何才能让它返回所有节点?

谢谢,

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-21 20:45:06

代码语言:javascript
复制
 foreach ($printerPathNode in $printerPathNodeList) {
        $XMLprinterPath = $printerPathNode.selectSingleNode("printerPath").get_innerXml()
 }

您已经遍历了这里的printerPaths/printerPath节点-不需要在该<printerPath>节点上执行另一个.selectsinglenode -只需从该$printerPathNode读取.InnerXml.InnerText -它们应该会给出您正在查找的值

票数 2
EN

Stack Overflow用户

发布于 2010-07-21 20:44:47

这是意料之中的,您将多次分配相同的变量($XMLprinterPath),因此第二个值将覆盖第一个值。您是否打算将其用作数组或列表?

票数 2
EN

Stack Overflow用户

发布于 2010-07-21 21:25:13

如果您有可用的PowerShell V2.0,您可以使用Select-Xml,它可以为您动态生成对象:

代码语言:javascript
复制
Select-Xml -Path "test.xml" -Xpath "/printDrivers/printDriver" | ForEach-Object {
    $id = $_.Node.id
    $inf = $_.Node.inf
    $driverPath = $_.Node.driverPath

    $_.Node | Select-Xml -Xpath "printerPaths/printerPath" | ForEach-Object {
        $printerPath = $_.Node.InnerText
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3299227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档