我有一系列主要和补充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
}
这会产生像这样的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“正确”组织起来会更好,因此......
<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>
然而,文件的实际内容比这复杂得多,我还没有找到一个内置机制来只追加节点,而不是追加和重复整个节点。所以,我想我的第一个问题是,我是否因为希望以这种方式构建内存中的XML而感到荒谬?有这样或那样的资源或性能参数吗?总XML仍然很小。大部分在磁盘上几百K,但我可以看到这随时间变化。并且,假设没有内置机制来组合而不仅仅是追加,我将不得不编写自己的代码,这意味着更多的编码时间,更多的潜在错误和更多的处理时间。而且,也许没有真正的世界价值。
此外,在我要导出这个XML的地方,我不喜欢源XML使用NotePad ++默认的四个空格,但合成的XML是两个空格。如果XML永远不会被人类读取,那么这并不是什么大问题,但理想情况下我更愿意发出格式良好的XML。我知道PSCX包含一个格式化程序,但我宁愿没有其他依赖项。我已经使用System.IO.StringWriter进行屏幕输出,但我还没有简单的方法来使用它来格式化XML以备保存。
最后一点。可悲的是,这两个问题都在PS v2的背景下,因为我目前无法执行更新的版本。如果有一个超级光滑的方式在较新版本中执行它我可能会有条件地进行格式化,但我希望能够在v2中解决这两个问题,如果可能的话。
同样,整个问题都是临界学术问题,正如我所做的那样有效。我只是想知道是否有改变或不改变的性能原因。如果有,它是一个简单的内置PowerShell cmdlet,还是一堆自定义代码?