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."
"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)
基于此,您可以投射String到XName:
$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)
| 归档时间: |
|
| 查看次数: |
5628 次 |
| 最近记录: |