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 回答
0

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

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

此命名空间中的所有内容都是在 powershell 中没有 New-Object 的情况下创建的。

于 2017-05-12T23:21:16.910 回答