У меня есть каталог очень больших 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
В то время как XSLT-способ сделать это довольно коротко, так же как и способ PowerShell:
$finalXml = "<root>"
foreach ($file in $files) {
[xml]$xml = Get-Content $file
$finalXml += $xml.InnerXml
}
$finalXml += "</root>"
([xml]$finalXml).Save("$pwd\final.xml")
Надеюсь, это поможет,
Лично я бы не стал использовать PowerShell для такой задачи.
Обычно вы используете PowerShell для доступа к подобным файлам конфигурации
$config = [xml](gc web.config)
, тогда вы можете работать с xml, как с объектами. Довольно круто.
Если вам нужно обработать большие xml-структуры, то использование [xml]
(что эквивалентно XmlDocument
) требует больших затрат памяти.
Однако это почти все, что PowerShell поддерживает xml ( get-command * xml * -CommandType cmdlet
предоставит вам все xml-подобные команды).
Конечно, можно использовать классы .NET для операций с XML, но этот код будет не таким красивым, как настоящий подход PowerShell. Итак, для вашей задачи вам нужно будет использовать для этого несколько читателей / писателей, что, по-моему, не стоит делать.
Вот почему я думаю, что xslt - лучший подход;) Если вам нужно проявить гибкость, вы можете сгенерировать шаблон xlst во время выполнения скрипта или просто заменить имена файлов, это не проблема.