在Powershell中将XML Document转换为自定义类对象

时间:2017-06-15 16:29:03

标签: xml powershell

我有一个XmlDocument,其中包含TitleID等属性。我还有一个C#类,它具有与Add-Type -Language CSharp -...相同的属性。是否有一种快速简便的方法来转换XmlDocument或它的子项以将其转换为C#类?

修改

我正在使用Powershell 4,XML看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Objects>
  <Object>
    <Property Name="Title">Foo</Property>
    <Property Name="Description">Bar</Property>
  </Object>
</Objects>

我的Powershell脚本看起来像这样:

$code = @"
    using System;
    namespace CSnamespace{
        public class CSclass {
            public string Name { get; set; };
            public string Description { get; set; };
        }
    }
"@
Add-Type -TypeDefinition $code -Language CSharp

$xml = [xml](Get-Content $path)

这不起作用,但我正在寻找类似的东西:

$CSclass = [CSnamespace.CSclass]$xml

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

PowerShell允许您动态地处理属性,例如

$pname = "Length"
"SomeString".$pname  # Instead of "SomeString".Length

现在,您可以动态浏览XML属性/节点,并将值分配给C#对象。例如,如果您的对象具有属性ab

$myObject = New-Object MyABObject
$myXml = [xml]"<root><a>12345</a><b>hello</b></root>"

foreach ($prop in $myXml.root | Get-Member -MemberType Property | select -ExpandProperty Name)
{
  $myObject.$prop = $myXml.root.$prop
}

答案 1 :(得分:0)

试试这个:

$document = [xml](Get-Content -path "C:\Path\To\My\XmlDocument.xml")

答案 2 :(得分:0)

借助TToni标记为“答案”的答复,我可以准确地得到所需的内容,但需要进行一些调整。我的Powershell代码如下:

foreach ($object in $xml.Objects.Object) {
    $cs = New-Object CSnamespace.CSclass
    foreach ($property in $object) {
        $cs.($property.Name) = $property.Innertext
    }
}