我想使用 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。”
答案 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。