在powershell中复制2 xmls之间的子节点

时间:2018-02-19 12:30:07

标签: xml powershell

我有2个XML文件
第一个XML文件:

<task>
  <name/>
  <transfer>
    <request version="6.00" xsi:noNamespaceSchemaLocation="FileTransfer.xsd">
      <managedTransfer>
        <originator>
          <hostName>host.corp.</hostName>
          <userID>jenkins</userID>
        </originator>
        <sourceAgent QMgr="${SourceQm}" agent="${SourceAgent}"/>
        <destinationAgent QMgr="${DestQm}" agent="${DestAgent}"/>
        <transferSet priority="0">
          <metaDataSet>
            <metaData key="site">${MdSite}</metaData>
            <metaData key="businessSourceSystem">${MdSourceSystem}</metaData>
            <metaData key="businessTargetSystem">${MdTargetSystem}</metaData>
            <metaData key="wricef">${MdWricef}</metaData>
          </metaDataSet>
        </transferSet>
        <job>
          <name>${MonitorName}</name>
        </job>
      </managedTransfer>
    </request>
  </transfer>
</task>

第二个XML文件:

<task>
  <name/>
  <transfer>
    <request version="6.00" xsi:noNamespaceSchemaLocation="FileTransfer.xsd">
      <managedTransfer>
        <originator>
          <hostName>HOST.corp</hostName>
          <userID>jenkins</userID>
        </originator>
        <sourceAgent QMgr="${SourceQm}" agent="${SourceAgent}"/>
        <destinationAgent QMgr="${DestQm}" agent="${DestAgent}"/>
        <transferSet priority="0">
        </transferSet>
        <job>
          <name>${MonitorName}</name>
        </job>
      </managedTransfer>
    </request>
  </transfer>
</task>

我想获取metaDataSet下的所有子节点并将它们从一个文件移动到另一个文件

我对powershell中的XML函数感到有点迷茫 欢迎任何方向

谢谢!

2 个答案:

答案 0 :(得分:1)

解决了它

$ENV:workspace="C:\TEMP\XMLTRANS\" $from = [xml](Get-Content $env:workspace\from.xml) $to = [xml](Get-Content $env:workspace\from2.xml) foreach ($node in $from.tasks.task.transfer.request.managedTransfer.transferSet.metaDataSet) { $to.tasks.task.transfer.request.managedTransfer.transferSet.AppendChild($to.ImportNode($node,$true))} $to.Save('C:\TEMP\XMLTRANS\last1.xml')

希望它会帮助某人:)

答案 1 :(得分:0)

我正在撰写关于在配置中添加XML节点的博客文章,这可能对您有所帮助。这是snippit:

$global:pathToConfig = "$PSScriptRoot\DistributedCacheService.exe.config" #put your path here

#force the config into an XML
$xml = [xml](get-content $pathToConfig)

#build new node by hand and force it to be an XML object
$newNode = [xml]@"
<appSettings>
 <add key="backgroundGC" value="true"/>
</appSettings>
"@

#add new node AFTER the configsections node
$xml.configuration.InsertAfter($xml.ImportNode($newNode.appSettings, $true), $xml.configuration.configsections)

#save file
$xml.Save("$pathToConfig.CHANGED.XML")

通过循环子节点,您的$newNode只需要来自其他文件的属性。

希望有所帮助!