Объединить несколько XML-файлов в один PowerShell 2.0 использования?

У меня есть каталог очень больших XML-файлов со структурой как это:

file1.xml:

<root>
 <EmployeeInfo attr="one" />
 <EmployeeInfo attr="two" />
 <EmployeeInfo attr="three" />
</root>

file2.xml:

<root>
 <EmployeeInfo attr="four" />
 <EmployeeInfo attr="five" />
 <EmployeeInfo attr="six" />
</root>

Теперь я ищу простой способ объединить эти файлы (*.xml) файлы в один выходной файл:

<root>
 <EmployeeInfo attr="one" />
 <EmployeeInfo attr="two" />
 <EmployeeInfo attr="three" />
 <EmployeeInfo attr="four" />
 <EmployeeInfo attr="five" />
 <EmployeeInfo attr="six" />
</root>

Я думал об использовании чистого XSLT, такого как этот:

<xsl:transform version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <Container>
      <xsl:copy-of select="document('file1.xml')"/>
      <xsl:copy-of select="document('file2.xml')"/>        
    </Container>
  </xsl:template>
</xsl:stylesheet>

Это работает, но не так гибко, как я хочу. Будучи новичком с PowerShell (версия 2), стремящаяся изучить новые лучшие методы работы с XML в PowerShell, я задаюсь вопросом, каков самый простой, самый чистый PowerShell способ объединить структуру XML-документов в один?

С наилучшими пожеланиями, Joakim

6
задан Start-Automating 30 June 2012 в 21:55
поделиться

2 ответа

В то время как XSLT-способ сделать это довольно коротко, так же как и способ PowerShell:

$finalXml = "<root>"
foreach ($file in $files) {
    [xml]$xml = Get-Content $file    
    $finalXml += $xml.InnerXml
}
$finalXml += "</root>"
([xml]$finalXml).Save("$pwd\final.xml")

Надеюсь, это поможет,

11
ответ дан 8 December 2019 в 18:32
поделиться

Лично я бы не стал использовать PowerShell для такой задачи.

Обычно вы используете PowerShell для доступа к подобным файлам конфигурации

$config = [xml](gc web.config)

, тогда вы можете работать с xml, как с объектами. Довольно круто. Если вам нужно обработать большие xml-структуры, то использование [xml] (что эквивалентно XmlDocument ) требует больших затрат памяти.

Однако это почти все, что PowerShell поддерживает xml ( get-command * xml * -CommandType cmdlet предоставит вам все xml-подобные команды).
Конечно, можно использовать классы .NET для операций с XML, но этот код будет не таким красивым, как настоящий подход PowerShell. Итак, для вашей задачи вам нужно будет использовать для этого несколько читателей / писателей, что, по-моему, не стоит делать.

Вот почему я думаю, что xslt - лучший подход;) Если вам нужно проявить гибкость, вы можете сгенерировать шаблон xlst во время выполнения скрипта или просто заменить имена файлов, это не проблема.

2
ответ дан 8 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: