尝试使用 PowerShell 将元素添加到现有 XML 文件。我查看了几个示例,我的“添加”脚本可以工作,但它放错了元素的位置。
我正在使用的 XML 示例:
<?xml version="1.0" encoding="UTF-8"?>
<config version="" id="" rev="" marker="">
<plugins>
<local>
<plugin class="LDAPPlugin">
<config version="0.2">
<users>
<search>
<priority>1</priority>
<suspended>false</suspended>
<scope>ALL</scope>
<orgName>AdmOrg</orgName>
<filter>LDAPFilter1</filter>
</search>
</users>
</config>
</plugin>
</local>
</plugins>
</config>
我想<search></search>
向上述 XMl 文件添加一个附加元素。使用此代码,我已经成功了一半:
$xmlPath = "C:\productionXML.xml"
$userSearchFilter = "C:\inputData.csv"
$doc = [XML](Get-Content -Path $xmlPath)
foreach($e in (Import-Csv -Path $userSearchFilter))
{
[STRING]$count = $doc.config.plugins.local.plugin.config.users.search.Count + 1
$element = $doc.config.plugins.local.plugin.config.users.search[0].clone()
$element.priority = $count
$element.suspended = $e.userSuspended
$element.scope = $e.userScope
$element.orgName = $e.userOrgMappingAttribute
$element.filter = $e.userFilter
$doc.DocumentElement.AppendChild($element)
}
$doc.Save("C:\newProductionXML.xml")
当我执行脚本时,元素被添加到 XML 的底部,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<config version="" id="" rev="" marker="">
<plugins>
<local>
<plugin class="LDAPPlugin">
<config version="0.2">
<users>
<search>
<priority>1</priority>
<suspended>false</suspended>
<scope>ALL</scope>
<orgName>AdmOrg</orgName>
<filter>LDAPFilter1</filter>
</search>
</users>
</config>
</plugin>
</local>
</plugins>
</config>
<search>
<priority>1</priority>
<suspended>false</suspended>
<scope>ALL</scope>
<orgName>AdmOrg</orgName>
<filter>NewLDAPFilter</filter>
</search>
我已经针对“不太复杂”的 XML 文件运行了此代码,它完全按照预期运行,但是,当我针对我需要的 XML 运行它时,它会将附加元素放置在 XML 文件的根目录下。请原谅我缺乏关于 XML 的确切语言,我并不经常以这种方式使用 XML。任何帮助都将不胜感激。
答案1
<search>
这里有几个问题。首先,由于一开始只有一个元素,因此该search
属性不会是集合。为了解决这个问题,我们可以使用 来GetElementsByTagName
确保我们始终获得一个集合。将 for 循环的前两行替换为以下内容:
$searchElements = $doc.config.plugins.local.plugin.config.users.GetElementsByTagName('search')
[STRING]$count = $searchElements.Count + 1
$element = $searchElements[0].Clone()
第二点与问题本身更相关,AppendChild
将DocumentElement
元素添加到主文档中。您想将其添加到标签中<users>
,因此我们调用AppendChild
属性users
。将 for 循环的最后一行替换为以下内容:
$doc.config.plugins.local.plugin.config.users.AppendChild($element) | Out-Null
只是Out-Null
为了阻止新附加的项目回显到控制台。