【问题标题】:SelectSingleNode() results in null valueSelectSingleNode() 产生空值
【发布时间】:2021-04-08 08:51:47
【问题描述】:

我欣然承认我不懂 XML,但我正在努力学习。也就是说,我在学习这个特殊问题时遇到了死胡同。

首先,我在这个链接上看到了这个帖子,但它的解决方案没有帮助: XML Document SelectSingleNode returns null 你可以看到我在下面添加了一些建议的代码,它导致了相同的行为。

我正在尝试将打印机列表附加到一个看起来很像这样的 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>
<REMOTE_PRINTING_NODE>
  <PRINTING_PARAMETERS_FILE>
  </PRINTING_PARAMETERS_FILE>
  <PRINTER_MAPPINGS>
    <PRINTER_MAPPING>
      <PHYSICAL>\\Server\Printer_1</PHYSICAL>
      <LOGICAL>Printer_1</LOGICAL>
    </PRINTER_MAPPING>
    <PRINTER_MAPPING>
      <PHYSICAL>\\Server\Printer_2</PHYSICAL>
      <LOGICAL>Printer_2</LOGICAL>
    </PRINTER_MAPPING>
  </PRINTER_MAPPINGS>
</REMOTE_PRINTING_NODE>

这里是导入、附加和保存 XML 数据的代码:

Install-Module PSExcel

$xml = [xml](Get-Content "C:\printer.xml")
$printerList = (Import-XLSX "C:\Printers.xlsx")

$ns = New-Object xml.xmlnamespacemanager($xml.NameTable)
$ns.AddNameSpace("x", "http://microsoft.com/GroupPolicy/GPOOperations/MigrationTable")

forEach ($printer in $printerList) {

    $mapEl = $xml.CreateElement("PRINTER_MAPPING")
    $LogEl = $xml.CreateElement("LOGICAL")
    $PhyEl = $xml.CreateElement("PHYSICAL")

    $PhyEl.AppendChild($xml.CreateTextNode("$($printer.Physical)"))
    $LogEl.appendChild($xml.CreateTextNode("$($printer.logical)"))

    $mapEl.AppendChild($PhyEl)
    $mapEl.AppendChild($LogEl)

    $mappings = $xml.SelectSingleNode("/x:REMOTE_PRINTING_NODE/x:PRINTER_MAPPINGS", $ns)
    $mappings.AppendChild($mapEl)

}
    
$xml.save("C:\printer.xml")

我遇到的问题是这一行:

$mappings.AppendChild($mapEl)

通过 foreach 循环的每次迭代都无法将构建的 XML 数据附加到文档中,因为 $mappings 为空。我不知道从这里去哪里。谢谢。

【问题讨论】:

  • 试试 $mappings = $xml.SelectSingleNode("/REMOTE_PRINTING_NODE/PRINTER_MAPPINGS", $ns)
  • 为什么不直接使用内置的 PowerShell cmdlet 来处理 XML?
  • @Aaron 成功了,谢谢!你能发布一个答案以便我标记它吗?

标签: xml powershell


【解决方案1】:

根据您的要求,先生。

尝试 $mappings = $xml.SelectSingleNode("/REMOTE_PRINTING_NODE/PRINTER_MAPPINGS", $ns)

【讨论】:

    【解决方案2】:

    继续我的评论。

    Get-Command -Name '*xml*' | Format-Table -AutoSize
    # Results
    <#
    CommandType Name          Version Source
    ----------- ----          ------- ------
    Cmdlet      ConvertTo-Xml 3.1.0.0 Microsoft.PowerShell.Utility
    Cmdlet      Export-Clixml 3.1.0.0 Microsoft.PowerShell.Utility
    Cmdlet      Import-Clixml 3.1.0.0 Microsoft.PowerShell.Utility
    Cmdlet      Select-Xml    3.1.0.0 Microsoft.PowerShell.Utility
    #>
    

    所以,你的帖子...

    [xml]$XmlData = '
    <REMOTE_PRINTING_NODE>
      <PRINTING_PARAMETERS_FILE>
      </PRINTING_PARAMETERS_FILE>
      <PRINTER_MAPPINGS>
        <PRINTER_MAPPING>
          <PHYSICAL>\\Server\Printer_1</PHYSICAL>
          <LOGICAL>Printer_1</LOGICAL>
        </PRINTER_MAPPING>
        <PRINTER_MAPPING>
          <PHYSICAL>\\Server\Printer_2</PHYSICAL>
          <LOGICAL>Printer_2</LOGICAL>
        </PRINTER_MAPPING>
      </PRINTER_MAPPINGS>
    </REMOTE_PRINTING_NODE>
    '
    
    Select-Xml -Xml $XmlData -XPath "//PRINTER_MAPPINGS"
    # Results
    <#
    Node             Path        Pattern           
    ----             ----        -------           
    PRINTER_MAPPINGS InputStream //PRINTER_MAPPINGS
    #>
    
    (Select-Xml -Xml $XmlData -XPath "//PRINTER_MAPPINGS").Node
    # Results
    <#
    PRINTER_MAPPING                   
    ---------------                   
    {PRINTER_MAPPING, PRINTER_MAPPING}
    #>
    
    ((Select-Xml -Xml $XmlData -XPath "//PRINTER_MAPPINGS").Node).PRINTER_MAPPING 
    # Results
    <#
    PHYSICAL           LOGICAL  
    --------           -------  
    \\Server\Printer_1 Printer_1
    \\Server\Printer_2 Printer_2
    #>
    

    因此,读取 XML,并添加到节点。

    [xml]$XmlData = Get-Content -Path 'D:\temp\printer.xml'
    
    $XmlElementMapping = $XmlData.CreateElement('PRINTER_MAPPING')
    $XmlData.REMOTE_PRINTING_NODE.PRINTER_MAPPINGS.AppendChild($XmlElementMapping)
    
    $XmlElementPhysical = $XmlData.CreateElement('PHYSICAL')
    $XmlElementPhysical.set_InnerText('\\Server\Printer_3')
    $XmlElementMapping.AppendChild($XmlElementPhysical)
    
    $XmlElementLogical = $XmlData.CreateElement('Logical')
    $XmlElementLogical.set_InnerText('Printer_3')
    $XmlElementMapping.AppendChild($XmlElementLogical)
    
    $XmlData.REMOTE_PRINTING_NODE.PRINTER_MAPPINGS.PRINTER_MAPPING
    # Results
    <#
    PHYSICAL           LOGICAL  
    --------           -------  
    \\Server\Printer_1 Printer_1
    \\Server\Printer_2 Printer_2
    \\Server\Printer_3 Printer_3
    #>
    
    $XmlData.save('D:\Temp\printer.xml')
    Get-Content -Path 'D:\temp\printer.xml'
    # Results
    <#
    <REMOTE_PRINTING_NODE>
      <PRINTING_PARAMETERS_FILE>
      </PRINTING_PARAMETERS_FILE>
      <PRINTER_MAPPINGS>
        <PRINTER_MAPPING>
          <PHYSICAL>\\Server\Printer_1</PHYSICAL>
          <LOGICAL>Printer_1</LOGICAL>
        </PRINTER_MAPPING>
        <PRINTER_MAPPING>
          <PHYSICAL>\\Server\Printer_2</PHYSICAL>
          <LOGICAL>Printer_2</LOGICAL>
        </PRINTER_MAPPING>
        <PRINTER_MAPPING>
          <PHYSICAL>\\Server\Printer_3</PHYSICAL>
          <Logical>Printer_3</Logical>
        </PRINTER_MAPPING>
      </PRINTER_MAPPINGS>
    </REMOTE_PRINTING_NODE>
    #>
    

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      相关资源
      最近更新 更多