使用 PowerShell 向 XML 文档添加数据时出现的问题

使用 PowerShell 向 XML 文档添加数据时出现的问题

尝试使用 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()

第二点与问题本身更相关,AppendChildDocumentElement元素添加到主文档中。您想将其添加到标签中<users>,因此我们调用AppendChild属性users。将 for 循环的最后一行替换为以下内容:

$doc.config.plugins.local.plugin.config.users.AppendChild($element) | Out-Null

只是Out-Null为了阻止新附加的项目回显到控制台。

相关内容