2

System.Xml.Linqオブジェクトを使用してプログラムで XML DOM を作成したいと考えています。文字列を解析したり、ディスクからファイルを読み込んで DOM を作成したりしたくありません。C# ではこれは簡単ですが、PowerShell でこれを行うことは不可能のようです。

オプション 1 : 機能しない

$xlinq = [Reflection.Assembly]::Load("System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
$el = new-Object System.Xml.Linq.XElement "foo"

これにより、次のエラーが発生します。

new-Object : Cannot convert argument "0", with value: "foo",
 for "XElement" to type "System.Xml.Linq.XElement": "Cannot convert value "foo" to
 type "System.Xml.Linq.XElement". Error: "Data at the root level is invalid. 
 Line 1, position 1.""

オプション 2:機能しない

$xlinq = [Reflection.Assembly]::Load("System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
$xname = New-Object System.Xml.Linq.XName "foo"
$el = new-Object System.Xml.Linq.XElement $xname

次のエラーが発生します。

New-Object : Constructor not found. Cannot find an appropriate constructor for type System.Xml.Linq.XName.

MSDN ( http://msdn.microsoft.com/en-us/library/system.xml.linq.xname.aspx )によると、「XName にはパブリック コンストラクターが含まれていません。代わりに、このクラスは String からの暗黙的な変換を提供します。 XName を作成できます。」

4

3 に答える 3

8
"XName does not contain any public constructors. Instead, this class provides an implicit conversion from String that allows you to create an XName."

これに基づいて、次のようにキャストできStringますXName

$xname = [System.Xml.Linq.XName]"foo"

$xname.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     XName                                    System.Object

それから:

$el = new-Object System.Xml.Linq.XElement $xname
$el


FirstAttribute :
HasAttributes  : False
HasElements    : False
IsEmpty        : True
LastAttribute  :
Name           : foo
NodeType       : Element
Value          :
FirstNode      :
LastNode       :
NextNode       :
PreviousNode   :
BaseUri        :
Document       :
Parent         :
LineNumber     : 0
LinePosition   : 0
于 2013-02-22T07:13:00.377 に答える
5

これもうまくいくはずです:

[System.Xml.Linq.XElement]::Parse("<foo/>")
于 2014-10-14T21:32:28.733 に答える