附加具有不同值的克隆 XML 节点 - Powershell
Append cloned XML node with different value - Powershell
我有一个 XML 文件,格式如下:
<?xml version="1.0" encoding="UTF-16"?>
<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/MigExcludeDrives">
<_locDefinition>
<_locDefault _loc="locNone" />
<_locTag _loc="locData">displayName</_locTag>
</_locDefinition>
<component type="Documents" context="UserAndSystem">
<displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
<role role="Data">
<rules>
<unconditionalExclude>
<objectSet>
<pattern type="File">something</pattern>
</objectSet>
</unconditionalExclude>
</rules>
</role>
</component>
</migration>
我需要克隆 <component>
标签几次,这取决于一些值,可能是大约 4-5 次。
我正在尝试使用以下代码,但我无法附加所有值,而只能附加最终值。
奇怪的是没有错误。
$something = @(1, 2, 3, 4, 5, 5)
foreach($num in $something) {
$drivething = "D:"
$xml = [xml](Get-Content -Path "C:\Temp\referenceXml.xml")
$element = $xml.migration.component.clone()
$xml.DocumentElement.AppendChild($element)
}
$xml.Save("C:\temp\newXML.xml")
预期输出为:
<?xml version="1.0" encoding="UTF-16"?>
<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/MigExcludeDrives">
<_locDefinition>
<_locDefault _loc="locNone" />
<_locTag _loc="locData">displayName</_locTag>
</_locDefinition>
<component type="Documents" context="UserAndSystem">
<displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
<role role="Data">
<rules>
<unconditionalExclude>
<objectSet>
<pattern type="File">something</pattern>
</objectSet>
</unconditionalExclude>
</rules>
</role>
</component>
<component type="Documents" context="UserAndSystem">
<displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
<role role="Data">
<rules>
<unconditionalExclude>
<objectSet>
<pattern type="File">1</pattern>
</objectSet>
</unconditionalExclude>
</rules>
</role>
</component>
<component type="Documents" context="UserAndSystem">
<displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
<role role="Data">
<rules>
<unconditionalExclude>
<objectSet>
<pattern type="File">2</pattern>
</objectSet>
</unconditionalExclude>
</rules>
</role>
</component>
</migration>
但我得到的只是:
<?xml version="1.0" encoding="UTF-16"?>
<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/MigExcludeDrives">
<_locDefinition>
<_locDefault _loc="locNone" />
<_locTag _loc="locData">displayName</_locTag>
</_locDefinition>
<component type="Documents" context="UserAndSystem">
<displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
<role role="Data">
<rules>
<unconditionalExclude>
<objectSet>
<pattern type="File">something</pattern>
</objectSet>
</unconditionalExclude>
</rules>
</role>
</component>
<component type="Documents" context="UserAndSystem">
<displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
<role role="Data">
<rules>
<unconditionalExclude>
<objectSet>
<pattern type="File">5</pattern>
</objectSet>
</unconditionalExclude>
</rules>
</role>
</component>
</migration>
我不确定我错过了什么。非常感谢任何帮助。提前致谢
您当前为每个循环迭代重新加载 XML,因此只有最后一个循环迭代会产生影响。 XML 应该在循环之前只加载一次。还要将 $xml.migration.component
保存在一个变量中,这样您就可以始终以相同的方式访问它,即使添加了更多元素(它变成了一个数组)也是如此。
$something = @(1, 2, 3, 4, 5, 5)
$xml = [xml]::new()
$xml.Load("C:\Temp\referenceXml.xml")
$component = $xml.migration.component
foreach($num in $something) {
$drivething = "D:"
$element = $component.clone()
$xml.DocumentElement.AppendChild($element)
}
$xml.Save("C:\temp\newXML.xml")
附带说明,我已将 Get-Content
替换为 $xml.Load()
,这样可以更好地处理 XML 编码。
我有一个 XML 文件,格式如下:
<?xml version="1.0" encoding="UTF-16"?>
<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/MigExcludeDrives">
<_locDefinition>
<_locDefault _loc="locNone" />
<_locTag _loc="locData">displayName</_locTag>
</_locDefinition>
<component type="Documents" context="UserAndSystem">
<displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
<role role="Data">
<rules>
<unconditionalExclude>
<objectSet>
<pattern type="File">something</pattern>
</objectSet>
</unconditionalExclude>
</rules>
</role>
</component>
</migration>
我需要克隆 <component>
标签几次,这取决于一些值,可能是大约 4-5 次。
我正在尝试使用以下代码,但我无法附加所有值,而只能附加最终值。
奇怪的是没有错误。
$something = @(1, 2, 3, 4, 5, 5)
foreach($num in $something) {
$drivething = "D:"
$xml = [xml](Get-Content -Path "C:\Temp\referenceXml.xml")
$element = $xml.migration.component.clone()
$xml.DocumentElement.AppendChild($element)
}
$xml.Save("C:\temp\newXML.xml")
预期输出为:
<?xml version="1.0" encoding="UTF-16"?>
<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/MigExcludeDrives">
<_locDefinition>
<_locDefault _loc="locNone" />
<_locTag _loc="locData">displayName</_locTag>
</_locDefinition>
<component type="Documents" context="UserAndSystem">
<displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
<role role="Data">
<rules>
<unconditionalExclude>
<objectSet>
<pattern type="File">something</pattern>
</objectSet>
</unconditionalExclude>
</rules>
</role>
</component>
<component type="Documents" context="UserAndSystem">
<displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
<role role="Data">
<rules>
<unconditionalExclude>
<objectSet>
<pattern type="File">1</pattern>
</objectSet>
</unconditionalExclude>
</rules>
</role>
</component>
<component type="Documents" context="UserAndSystem">
<displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
<role role="Data">
<rules>
<unconditionalExclude>
<objectSet>
<pattern type="File">2</pattern>
</objectSet>
</unconditionalExclude>
</rules>
</role>
</component>
</migration>
但我得到的只是:
<?xml version="1.0" encoding="UTF-16"?>
<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/MigExcludeDrives">
<_locDefinition>
<_locDefault _loc="locNone" />
<_locTag _loc="locData">displayName</_locTag>
</_locDefinition>
<component type="Documents" context="UserAndSystem">
<displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
<role role="Data">
<rules>
<unconditionalExclude>
<objectSet>
<pattern type="File">something</pattern>
</objectSet>
</unconditionalExclude>
</rules>
</role>
</component>
<component type="Documents" context="UserAndSystem">
<displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
<role role="Data">
<rules>
<unconditionalExclude>
<objectSet>
<pattern type="File">5</pattern>
</objectSet>
</unconditionalExclude>
</rules>
</role>
</component>
</migration>
我不确定我错过了什么。非常感谢任何帮助。提前致谢
您当前为每个循环迭代重新加载 XML,因此只有最后一个循环迭代会产生影响。 XML 应该在循环之前只加载一次。还要将 $xml.migration.component
保存在一个变量中,这样您就可以始终以相同的方式访问它,即使添加了更多元素(它变成了一个数组)也是如此。
$something = @(1, 2, 3, 4, 5, 5)
$xml = [xml]::new()
$xml.Load("C:\Temp\referenceXml.xml")
$component = $xml.migration.component
foreach($num in $something) {
$drivething = "D:"
$element = $component.clone()
$xml.DocumentElement.AppendChild($element)
}
$xml.Save("C:\temp\newXML.xml")
附带说明,我已将 Get-Content
替换为 $xml.Load()
,这样可以更好地处理 XML 编码。