如何使用PowerShell将具有不同元素/节点的xml文件合并到单个文件中

如何使用PowerShell将具有不同元素/节点的xml文件合并到单个文件中,xml,powershell,Xml,Powershell,我正在尝试使用PowerShell将3个xml文件合并为1个。 我已经尝试过使用selectxml、CreateElement和AppendChild等多种方法,但似乎无法理解如何将我想要的元素正确地包含到新的Xml文档中。我在节点中得到一个空的结果文件或System.Xml.Element 这三个文件的内容如下: 归档 成功 文件B <?xml version="1.0" encoding="utf-8"?> <ResourcePrototypeResponse>

我正在尝试使用PowerShell将3个xml文件合并为1个。 我已经尝试过使用selectxml、CreateElement和AppendChild等多种方法,但似乎无法理解如何将我想要的元素正确地包含到新的Xml文档中。我在节点中得到一个空的结果文件或System.Xml.Element

这三个文件的内容如下: 归档


成功
文件B

<?xml version="1.0" encoding="utf-8"?>
<ResourcePrototypeResponse>
<Status>Success</Status>
<ResourcePrototype instanceId='10164' resourceTypeId='3' id='10213' name='TCP Socket'/>
</ResourcePrototypeResponse>

成功
文件C

<?xml version="1.0" encoding="utf-8"?>
      <Resource name="SocketHTTP">
            <ResourceConfig key="hostname" value="localhost"/>
            <ResourceConfig key="port" value="80"/>
            <ResourceConfig key="sotimeout" value="10"/>
            <ResourceConfig key="service.log_track.enable" value="false"/>
            <ResourceConfig key="service.log_track.level" value="Error"/>
            <ResourceConfig key="service.log_track.include" value=""/>
            <ResourceConfig key="service.log_track.exclude" value=""/>
            <ResourceInfo key="autoIdentifier" value="SocketHTTP"/>
        </Resource>

我希望创建的文件看起来像:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CreateResourceRequest>
<Resource id="12345" name="aName" description="Microsoft Windows 2008" location="" instanceId="10087" typeId="1">
 <Agent id="23456" address="x.x.x.x" port="2144" version="x.x.x" unidirectional="false"/>
  <Ip address="x.x.x.x" netmask="255.255.255.0"/>
  <Ip address="x.x.x.x" netmask="255.0.0.0"/>
 <ResourceInfo key="fqdn" value="aName.here.lo"/>
 </Resource>
 <ResourcePrototype instanceId="10164" resourceTypeId="3" id="10213" name="TCP Socket"/>
      <Resource name="SocketHTTP">
            <ResourceConfig key="hostname" value="target.here.lo"/>
            <ResourceConfig key="port" value="80"/>
            <ResourceConfig key="sotimeout" value="10"/>
            <ResourceConfig key="service.log_track.enable" value="false"/>
            <ResourceConfig key="service.log_track.level" value="Error"/>
            <ResourceConfig key="service.log_track.include" value=""/>
            <ResourceConfig key="service.log_track.exclude" value=""/>
            <ResourceInfo key="autoIdentifier" value="SocketHTTP"/>
        </Resource>

</CreateResourceRequest>


提前谢谢,我被难住了……

你需要这样的东西:

function Add-XmlFromFile ([String]$Path,
                          [String]$XPath,
                          [System.Xml.XmlElement]$ParentElement) {

    [System.Xml.XmlElement]$ChildElement = `
        (Select-Xml -Path $Path -XPath $XPath).Node

    [System.Xml.XmlElement]$ImportedElement = `
        $ParentElement.OwnerDocument.ImportNode($ChildElement, $true)

    return $ParentElement.AppendChild($ImportedElement)
}

# Creating new XML object.
$Xml = New-Object Xml
$XmlDeclaration = $Xml.CreateXmlDeclaration("1.0", "UTF-8", $null)
$Xml.AppendChild($XmlDeclaration) | Out-Null

# Creating parent element.
$CreateResourceRequest = $Xml.CreateElement("CreateResourceRequest")

# Adding child elements to parent.
Add-XmlFromFile -Path "File A.xml" `
    -XPath "//ResourceResponse/Resource" `
    -ParentElement $CreateResourceRequest | Out-Null
Add-XmlFromFile -Path "File B.xml" `
    -XPath "//ResourcePrototypeResponse/ResourcePrototype" `
    -ParentElement $CreateResourceRequest | Out-Null
Add-XmlFromFile -Path "File C.xml" `
    -XPath "//Resource" `
    -ParentElement $CreateResourceRequest | Out-Null

# Appending parent to XML object.
$Xml.AppendChild($CreateResourceRequest) | Out-Null

# Saving XML object.
$Xml.OuterXml | Out-File -FilePath "File D.xml" -Encoding "UTF8"

很好用!不仅如此,我更了解它。但愿我能早点问。。。再次感谢。如此接近。。。。。我看到$Xml.AppendChild($XmlDeclaration)| Out Null在“Added
-编码”UTF8
之前插入3个字节-实际上默认情况下PS使用UCS-2小端编码。但是,无论是使用UCS-2还是UTF-8,我都无法重现这个问题(在PS 2.0中)-我的代码生成的文件中没有看到任何其他字符。谢谢Alexander。我使用的是PS4(升级后,在标题周围找到了PS3调用RestMethod错误)。我还添加了-Encoding uft8开关,因为负载最终是Unicode,我需要纯文本。它似乎是文件编写方式的产物。我找到了一些关于导致这种情况的流编码的信息。我用十六进制编辑器和tcpdump确认了文件中的数据。我决定直接写入有效负载,而不是先保存它。(应该一直这么做!)再次感谢您的快速回复!
function Add-XmlFromFile ([String]$Path,
                          [String]$XPath,
                          [System.Xml.XmlElement]$ParentElement) {

    [System.Xml.XmlElement]$ChildElement = `
        (Select-Xml -Path $Path -XPath $XPath).Node

    [System.Xml.XmlElement]$ImportedElement = `
        $ParentElement.OwnerDocument.ImportNode($ChildElement, $true)

    return $ParentElement.AppendChild($ImportedElement)
}

# Creating new XML object.
$Xml = New-Object Xml
$XmlDeclaration = $Xml.CreateXmlDeclaration("1.0", "UTF-8", $null)
$Xml.AppendChild($XmlDeclaration) | Out-Null

# Creating parent element.
$CreateResourceRequest = $Xml.CreateElement("CreateResourceRequest")

# Adding child elements to parent.
Add-XmlFromFile -Path "File A.xml" `
    -XPath "//ResourceResponse/Resource" `
    -ParentElement $CreateResourceRequest | Out-Null
Add-XmlFromFile -Path "File B.xml" `
    -XPath "//ResourcePrototypeResponse/ResourcePrototype" `
    -ParentElement $CreateResourceRequest | Out-Null
Add-XmlFromFile -Path "File C.xml" `
    -XPath "//Resource" `
    -ParentElement $CreateResourceRequest | Out-Null

# Appending parent to XML object.
$Xml.AppendChild($CreateResourceRequest) | Out-Null

# Saving XML object.
$Xml.OuterXml | Out-File -FilePath "File D.xml" -Encoding "UTF8"