Объединить конфигурационные файлы среды xml - PullRequest
1 голос
/ 20 марта 2020

Я хочу создать конфигурации конфигурации обобщенных сред и хотел бы реализовать это следующим образом. Вот файловая структура:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...