【问题标题】:Powershell: convert XmlDocument to XmlNodePowershell:将 XmlDocument 转换为 XmlNode
【发布时间】:2015-07-07 23:38:20
【问题描述】:

我想知道是否可以在 PowerShell 中将 Xml 文档转换为 Xml 节点。所以之后,我可以获取每个属性,甚至可以将节点附加到另一个 Xml 文件中。

我找到了“Import-Clixml”,但我收到了一个错误,我想我知道如何解决,但我想知道我是否可以绕过它。

Import-Clixml : Element 'Objs' with namespace name 'http://schemas.microsoft.com/powershell/2004/04' was not found. Line 2, position 2.
At line:1 char:1
+ Import-Clixml .\FLSCHOBVWCGRB1.xml
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Import-Clixml], XmlException
    + FullyQualifiedErrorId : System.Xml.XmlException,Microsoft.PowerShell.Commands.ImportClixmlCommand

编辑:

不转换 XmlDocument 并附加到另一个 XmlDocument

这是我使用的 PowerShell 脚本:

$xml = New-Object XML
$xml.load('c:\Users\Acer\Desktop\big.xml')
$servers = Select-Xml -Xml $xml -XPath '//SERVERS'
$doc = [Xml](gc 'c:\Users\Acer\Desktop\node.xml')
$servers.Node.AppendChild($doc)

这是错误:

Exception calling "AppendChild" with "1" argument(s): "The specified node cannot be inserted as the valid child of this node, because the specified node is the wrong type."
At line:6 char:1
+ $servers.Node.AppendChild($doc)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

【问题讨论】:

  • XmlDocument 继承自XmlNode,这意味着每个XmlDocument 都是XmlNode,不需要转换。
  • 所以,你可以追加/插入/前置/等。到另一个XmlDocument
  • 我不明白为什么你不能这样做。你尝试任何代码吗?是否抛出异常或产生意外结果?
  • 请查看编辑。代码可能是错误的。我是新手。

标签: powershell


【解决方案1】:

如果要将节点从一个文档添加到另一个文档,则必须先导入它:

$xml = New-Object XML
$xml.load('c:\Users\Acer\Desktop\big.xml')
$servers = Select-Xml -Xml $xml -XPath '//SERVERS'
$doc = [Xml](gc 'c:\Users\Acer\Desktop\node.xml')
$imported=$xml.ImportNode($doc.DocumentElement,$true)
$servers.Node.AppendChild($imported)
$xml.Save('c:\Users\Acer\Desktop\big2.xml')

【讨论】:

    【解决方案2】:

    当心 *CliXML cmdlet

    他们几乎让每个人都失败了。不可避免地,在他们的 powershell 职业生涯中的每个人都会偶然发现需要导入 XML 文档并尝试使用 Import-CliXML Cmdlet 并被淹没。

    使用这些 Cmdlet 的唯一原因是从 PowerShell 会话中导出和导入对象并保留其丰富的 .Net 类型信息。可以说,任何时候你需要使用它们,你也可以很容易地使用Import-/Export-CSV。因此,如果您正在帮助朋友解决一些命令并且他有您需要使用的变量,他可以使用 Export-CLIXml cmdlet 导出他的所有变量,并将它们与他的代码一起提供给您。然后你可以Import-CLIXml 对抗它们,然后你就会有一个大致相同的环境来帮助解决问题。

    话虽如此,*CLIXml cmdlet 并不意味着在您有要导入的 XML 文件时使用。

    实际上导入 XML 文件很容易 :)

    如果您想导入 XML 文档,最简单的方法如下:

    $XMLDocument = [XML](Get-Content .\XMLFile.Xml)
    

    这将指示 PowerShell 使用 Get-Content 读取文件,并使用其内置的 Casting 和转换方法将其作为 XML 文件读取。非常简单!

    示例

    拿这个超级简单的 XML 文档:

    <?xml version="1.0" encoding="UTF-8"?>
    <note>
       <to>Tove</to>
       <from>Jani</from>
       <heading>Reminder</heading>
       <body>Don't forget me this weekend!</body>
    </note>
    

    假设它被命名为 simple.xml,如果我们按照我给你的步骤进行操作,我们将得到以下结果:

    PS T:\> $XML = [xml](Get-Content .\simple.xml)
    PS T:\> $XML
    
    xml                                             note
    ---                                             ----
    version="1.0" encoding="UTF-8"                  note
    

    然后,我们可以使用 PowerShell 的漂亮 .Notation(发音为“Dot notation”)语法进入属性。因此,如果我想获取注释的正文,我只需像这样添加属性名称即可。

    PS T:\> $XML.note.body
    Don't forget me this weekend!
    

    我希望这会有所帮助,如果您有任何问题或希望帮助从非常复杂的 .XML 文档中访问值,请回复并将您的源文档发布到 PasteBin 或其他任何地方。

    【讨论】:

    • 谢谢你的这篇文章,我每年都需要解析xml,我忘记了这个问题,然后记住了在powershell中做xml的真正方法。
    猜你喜欢
    • 2011-01-23
    • 2011-07-20
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多