Использование powershell для управления xml-файлом dom и создания другого xml-файла - PullRequest
2 голосов
/ 20 июня 2019

У меня есть XML-файл, показанный ниже.С помощью powershell мне нужно скопировать тег connectionStrings в другой файл XML.

Config.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <system.web>
      <compilation debug="true" targetFramework="4.7.2" />
      <httpRuntime targetFramework="4.7.2" />
   </system.web>
   <system.codedom>
      <compilers>
         <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
         <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
      </compilers>
   </system.codedom>
   <connectionStrings>
      <add connectionString="uid=u1;pwd=p1;database=d1" name="connect1" />
   </connectionStrings>
 <Appsettings>
      <add key="key1" value1="value1" />
  </Appsettings>
</configuration>

После копирования целевой XML должен выглядеть следующим образом.И конечный xml - это новый файл, и он не существует.

Output.xml

<configuration>
 <connectionStrings>
      <add connectionString="uid=u1;pwd=p1;database=d1" name="connect1" />
   </connectionStrings>
</configuration>

Как мне добиться этого в powershell с помощью манипуляции xml dom.Любой пример кода XML манипулирования этим.

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Не самое элегантное решение, и может использоваться для удаления других узлов в других документах.

$Nodes = @("system.web","Appsettings","system.codedom")
$XMLFile = "C:\Config.xml"

$XMLDoc = (Select-Xml -Path $XMLFile -XPath /).Node
$ParentNode = $XMLDoc.configuration

$xml2 = New-Object System.Xml.XmlDocument
$newNode = $xml2.ImportNode($ParentNode, $true)
$xml2.AppendChild($newNode)

Foreach($Node in $Nodes) {
    $Delete = $xml2.SelectSingleNode("//$Node")
    $Delete.ParentNode.RemoveChild($Delete)
}

$xml2.Save("C:\Output.xml")
0 голосов
/ 20 июня 2019

Я получил некоторую подсказку из вашего ответа.Большое спасибо за помощь.Обновление решения, которое я получил.Это может быть полезно для других.

$connectionString = "connectionString.config"

[xml]$SourceConfigXml = Get-Content -Path "$connectionString" -Raw
$SourceXmlNode = $SourceConfigXml | Select-Xml -XPath "/connectionStrings"
Write-Output "$SourceXmlNode"

$xml2 = New-Object System.Xml.XmlDocument
[System.XML.XMLElement]$configurationRoot=$xml2.CreateElement("configuration")
$xml2.appendChild($configurationRoot)

[void] $configurationRoot.AppendChild($xml2.ImportNode($SourceXmlNode.Node, $true))
$xml2.Save("C:\temp\sample\sample1.xml")
...