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

时间:2013-02-22 02:48:42

标签: 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"

这会出现以下错误:

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。”

3 个答案:

答案 0 :(得分:7)

"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

答案 1 :(得分:5)

这也应该有效:

[System.Xml.Linq.XElement]::Parse("<foo/>")

答案 2 :(得分:0)

我注意到你做错了一件事是[System.Xml.Linq.XElement]有一些自定义实例所以删除New- Object

$el = [System.Xml.Linq.XElement]::new ([System.Xml.Linq.XName]"foo")

此命名空间中的所有内容都是在PowerShell中创建时没有New- Object。