如何使用PowerShell创建新的System.Xml.Linq.XElement

sav*_*enr 1 xml powershell system.xml

我想使用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"
Run Code Online (Sandbox Code Playgroud)

这会出现以下错误:

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.""
Run Code Online (Sandbox Code Playgroud)

选项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
Run Code Online (Sandbox Code Playgroud)

它给出了这个错误:

New-Object : Constructor not found. Cannot find an appropriate constructor for type System.Xml.Linq.XName.
Run Code Online (Sandbox Code Playgroud)

根据MSDN(http://msdn.microsoft.com/en-us/library/system.xml.linq.xname.aspx),"XName不包含任何公共构造函数.而是,此类提供从String的隐式转换,允许你创建一个XName."

CB.*_*CB. 7

"XName does not contain any public constructors. Instead, this class provides an implicit conversion from String that allows you to create an XName."
Run Code Online (Sandbox Code Playgroud)

基于此,您可以投射StringXName:

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

$xname.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     XName                                    System.Object
Run Code Online (Sandbox Code Playgroud)

然后:

$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
Run Code Online (Sandbox Code Playgroud)


Cra*_*SFT 5

这也应该有效:

[System.Xml.Linq.XElement]::Parse("<foo/>")
Run Code Online (Sandbox Code Playgroud)