Я хочу создать конфигурации конфигурации обобщенных сред и хотел бы реализовать это следующим образом. Вот файловая структура:
core
| publish.xml
project
| repository
| environment
| publish.xml
| publish.xml
Существует иерархическая структура файлов / папок, где в каждой папке может существовать или не существовать publish.xml
файл. Я хочу прочитать папку из папки root в папку environment
и прочитать этот файл xml в каждой папке. Каждый следующий уровень либо отменяет существующую конфигурацию, либо добавляет новую.
Вот пример файла конфигурации:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ExcludeDatabaseAuditSpecifications>True</ExcludeDatabaseAuditSpecifications>
<AllowIncompatiblePlatform>True</AllowIncompatiblePlatform>
</PropertyGroup>
</Project>
и еще один xml с нижнего уровня:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<AllowIncompatiblePlatform>False</AllowIncompatiblePlatform>
</PropertyGroup>
<ItemGroup>
<SqlCmdVariable Include="users">
<Value>users</Value>
</SqlCmdVariable>
</ItemGroup>
</Project>
в качестве вывода я получу sh, чтобы получить
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<AllowIncompatiblePlatform>False</AllowIncompatiblePlatform>
<ExcludeDatabaseAuditSpecifications>True</ExcludeDatabaseAuditSpecifications>
</PropertyGroup>
<ItemGroup>
<SqlCmdVariable Include="users">
<Value>users</Value>
</SqlCmdVariable>
</ItemGroup>
</Project>
Вот код, который я уже написал. Его можно добавить в конец документа, но не в PropertyGroup или ItemGroup
if ($null -eq $SecondXml) {
return $FirstXml;
}
if ($null -eq $FirstXml) {
return $SecondXml;
}
$finalXml = $FirstXml;
foreach($el in $SecondXml.Project.PropertyGroup) {
$name = $($el| Get-Member -MemberType property | Select-Object Name).Name;
if (!($null -eq $finalXml.Project.PropertyGroup.$name)) {
$finalXml.Project.PropertyGroup.$name = $el.$name;
} else {
$xmlElt = $finalXml.CreateElement($name);
$xmlText = $finalXml.CreateTextNode($el.$name);
$xmlElt.AppendChild($xmlText);
$finalXml.LastChild.AppendChild($xmlElt);
$finalXml.LastChild.AppendChild($xmlElt);
}
}