Объединить несколько файлов XML в один с помощью PowerShell 2.0? - PullRequest
6 голосов
/ 04 июня 2010

У меня есть каталог очень больших 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-документов в один?

Ура, Йоаким

Ответы [ 2 ]

11 голосов
/ 04 июня 2010

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

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

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

2 голосов
/ 04 июня 2010

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

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

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

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

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

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

...