合并而不是附加XML

合并而不是附加XML,xml,powershell,Xml,Powershell,我有一系列的主XML文件和补充XML文件,需要在内存中合并以供参考。到目前为止,我一直在使用AppendChild方法,它是有效的,但它并不美观,当我决定要保存一个组合文件时,它确实开始成为一个问题 所以,以简化的形式,我有这个 $mainXml = [xml]'<Definitions> <Sets> <Set id="Test"> <Package>Main</Package>

我有一系列的主XML文件和补充XML文件,需要在内存中合并以供参考。到目前为止,我一直在使用AppendChild方法,它是有效的,但它并不美观,当我决定要保存一个组合文件时,它确实开始成为一个问题

所以,以简化的形式,我有这个

$mainXml = [xml]'<Definitions>
    <Sets>
        <Set id="Test">
            <Package>Main</Package>
        </Set>
    </Sets>
    <Packages>
        <Package id="Main">
            <Rollout>
                <Machine>
                    <Enroll id="Enroll" />
                </Machine>
                <User>
                </User>
            </Rollout>
        </Package>
    </Packages>
</Definitions>'

$supplamentalXml = [xml]'<Definitions>
    <Sets>
        <Set id="Supplamental">
            <Package>Supplamental</Package>
        </Set>
    </Sets>
    <Packages>
        <Package id="Supplamental">
            <Rollout>
                <Machine>
                    <Enroll id="Enroll" />
                </Machine>
                <User>
                </User>
            </Rollout>
        </Package>
    </Packages>
</Definitions>'

$finalXml = $mainXml

foreach ($node in $supplamentalXml.DocumentElement.ChildNodes) {
    $finalXml.DocumentElement.AppendChild($finalXml.ImportNode($node, $true)) > $null
}
$mainXml=[xml]'
主要
'
$supplamentalXml=[xml]'
恳求的
'
$finalXml=$mainXml
foreach($supplamentalXml.DocumentElement.ChildNodes中的节点){
$finalXml.DocumentElement.AppendChild($finalXml.ImportNode($node,$true))>$null
}
这会产生如下XML

<Definitions>
  <Sets>
    <Set id="Test">
      <Package>Main</Package>
    </Set>
  </Sets>
  <Packages>
    <Package id="Main">
      <Rollout>
        <Machine>
          <Enroll id="Enroll" />
        </Machine>
        <User>
        </User>
      </Rollout>
    </Package>
  </Packages>
  <Sets>
    <Set id="Supplamental">
      <Package>Supplamental</Package>
    </Set>
  </Sets>
  <Packages>
    <Package id="Supplamental">
      <Rollout>
        <Machine>
          <Enroll id="Enroll" />
        </Machine>
        <User />
      </Rollout>
    </Package>
  </Packages>
</Definitions>

主要
恳求的
这是可行的,因为我可以使用XPath SelectNodes来获取集合,我将同时获取这两个集合。但我有一部分人认为,最好将生成的XML“正确地”组织起来,这样


主要
恳求的
但是,文件的实际内容要比这复杂得多,而且我还没有找到一种内置的机制来只追加节点,而不是追加和重复整个节点。所以,我想我的第一个问题是,我希望内存中的XML以这种方式构造,这是不是太荒谬了?是否存在这样或那样的资源或性能参数?XML总量仍然很小。大多数情况下,磁盘上有几百K的内存,但我可以看到这种情况随着时间的推移而变化。而且,假设没有内置的机制来组合,而不仅仅是附加,我将不得不编写自己的代码,这意味着更多的编码时间、更多的潜在错误和更多的处理时间。再说一次,也许没有现实世界的价值

此外,在我想要导出此XML的地方,我不喜欢源XML使用NotePad++默认的四个空格缩进,但合成的XML是两个空格。如果XML从未被人类读取,那也没什么大不了的,但理想情况下,我更喜欢发出格式良好的XML。我知道PSCX包含一个格式化程序,但我不希望有额外的依赖项。我使用System.IO.StringWriter进行屏幕输出,但我还没有找到一种简单的方法来使用它格式化准备保存的XML

最后一个音符。遗憾的是,这两个问题都是在PS v2的背景下提出的,因为我目前无法强制执行更新的版本。如果有一个超级灵活的方法在更新的版本中实现,我可能会有条件地进行格式化,但如果可能的话,我希望能够在v2中解决这两个问题

再一次,整个问题是边缘学术性的,正如我所做的功能性工作一样。我只是想知道是否有性能原因需要更改,或者不更改。如果有,它是一个简单的内置PowerShell cmdlet,还是一堆自定义代码

<Definitions>
  <Sets>
    <Set id="Test">
      <Package>Main</Package>
    </Set>
    <Set id="Supplamental">
      <Package>Supplamental</Package>
    </Set>
  </Sets>
  <Packages>
    <Package id="Main">
      <Rollout>
        <Machine>
          <Enroll id="Enroll" />
        </Machine>
        <User>
        </User>
      </Rollout>
    </Package>
    <Package id="Supplamental">
      <Rollout>
        <Machine>
          <Enroll id="Enroll" />
        </Machine>
        <User />
      </Rollout>
    </Package>
  </Packages>
</Definitions>