用于创建xml

时间:2017-07-19 13:54:55

标签: xml powershell

更新:请参见底部的工作示例。

我尝试使用对象作为输入来创建XML文件:

Get-ActiveDirectoryForest -Domain $Domain | GenerateXml

如何将对象传递给其他函数并使用此对象创建XML文件?通过throug传递的对象始终具有相同的第一个属性(TableName),其余属性不同。

我的对象看起来像:

TableName                   Domain      User        Status      UNC
Network-Domain-Locked users test.local  John Doe    Locked      John.Doe@test.local
Network-Domain-Locked users test.local  Jane Doe    Locked      Jane.Doe@test.local

我创造的功能:

Function GenerateXml {
[CmdLetBinding()]
    Param (
        [parameter(Mandatory=$True, ValueFromPipelineByPropertyName=$True)]
        [Object]$Object,

        [parameter(Mandatory=$True, ValueFromPipelineByPropertyName=$True)]
        [String]$TableName
    )
    Begin {

        $XmlExportPath = $Script:Settings.XmlFolder
        If ((Test-Path -Path $XmlExportPath\export.xml)) {
            Remove-Item -Path $XmlExportPath\export.xml -Force
        }

Add-Content -Path $XmlExportPath\export.xml -Value @'
<?xml version="1.0" encoding="utf-8"?>
<ImportFile>
    <Module Name="Network-Collection">
        <Task>Test export object</Task>
    </Module>
    <Input TableName="$TableName">
'@
    }
    Process {
        Try {
            $TableName = $Object.TableName  #Can't find the property on the object..
            Write-Host "Database tabel: $TableName"

            $(foreach ($Item in $Object) {
                Add-Content -Path $XmlExportPath\export.xml -Value '@`t`t<$($Item.Key)>$($Item.Value)</$($Item.Key)>@'
            })
        }
        Catch { Write-Error $_ }
    } 
    End {
Add-Content -Path $XmlExportPath\export.xml -Value @'
    </Input>
</BitImportFile>
'@
    } # End Region
}

@Update:
- 我已经删除了Mandatory = $ True,发现对象可以通过`$ _来访问。 - 关于xml的问题仍然存在

@Update 2:工作示例

Function GenerateXml {

[CmdLetBinding()]

    Param (
        [parameter(ValueFromPipelineByPropertyName=$True)]
        [Object]$Object,

        [parameter(ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)]
        [String]$TableName
    )

    Begin {
        $XmlExportFile = "C:\Temp\Export.xml"

        [xml]$Xml = @'
<?xml version="1.0" encoding="utf-8"?>
<ImportFile>
    <Module Name="" Date="" />
    <Input TableName="">
    </Input>
</ImportFile>
'@
    }

    Process {
        Try {
            $XmlNode = $Xml.ImportFile
            $XmlNode.Module.Name = $_.TaskName
            $XmlNode.Input.TableName = $_.TableName
            $XmlProperties = $_.PSObject.Properties

            Foreach ($XmlProp in ($XmlProperties | Where-Object {$_.Name -ne "TaskName" -and $_.Name -ne "TableName"})) {
                $Name = $XmlProp.Name
                $Value = $XmlProp.Value

                $newRole = $xml.CreateElement($Name)
                $Xml.ImportFile.Input.AppendChild($newRole) | Out-Null
                $newRole.SetAttribute("Value",$Value);
            }
        }
        Catch { Write-Error $_ }
    } 

    End {
        $Xml.Save("$XmlExportFile")
    }
}

1 个答案:

答案 0 :(得分:1)

假设CovertTo-XML输出不符合您的喜好,并且您想手动构建XML文件,那么就可以这样做。

为XML文档奠定基础并将其存储在变量中:

[xml]$xml = @'
<?xml version="1.0" encoding="utf-8"?>
<ImportFile>
    <Module Name="Network-Collection">
        <Task>Test export object</Task>
    </Module>
    <Input TableName="$TableName">
    </Input>
</ImportFile>
'@

现在您拥有了文件的shell,您可以随意添加新节点。您可能会执行foreach对象并根据该记录的需要创建XML元素和属性。然后将其附加回已存在的父节点。

$newNode = $xml.CreateElement('Test') # Here we make a XML element that is compatible with with $xml document as a whole.

$xml.ImportFile.Input.appendNode($newNode) # and here we attach that Test node to the existing Input node.

如果你想添加一个属性,你可以在添加它之前将其添加到$ newNode,如下所示:

$newNode.SetAttribute('name','myDomain')