PowerShell调用JsonConvert.SerializeXmlNode转XML为JSON报方法不存在
问题根因
这个报错和SerializeXmlNode方法是否废弃没有关系,核心是你导入的newtonsoft.json模块有问题:PowerShell Gallery上流传的同名第三方模块大多是个人打包的,要么带的Newtonsoft.Json程序集版本过旧,要么为了压缩体积裁剪掉了XML序列化相关的方法;另外如果当前PowerShell会话已经加载了系统/其他模块自带的低版本Newtonsoft.Json,也会因为程序集版本优先级问题,导致调用不到目标方法。
方案1:正确加载完整版Newtonsoft.Json调用SerializeXmlNode方法
不要依赖第三方打包的模块,手动加载官方发布的完整版Newtonsoft.Json.dll即可正常调用方法,参考代码:
# 替换为你本地存放官方完整版Newtonsoft.Json.dll的实际路径 Add-Type -Path "D:\libs\Newtonsoft.Json.dll" $filename = "E:\Udemy\Complete Guide to XML For Microsoft Developers\Lecture 5\XMLClass_Downloads_2021_03_28\IntroSamples\Flight01.xml" [xml]$xmlDoc = [System.IO.File]::ReadAllText($filename) # 第二个参数是序列化配置枚举,填0就是默认格式,也可以按需配置是否缩进、忽略XML属性等 $jsonText = [Newtonsoft.Json.JsonConvert]::SerializeXmlNode($xmlDoc, 0) # 输出转换结果验证 $jsonText
执行时注意以下事项:
- 加载dll前请新开一个PowerShell会话执行,避免之前缓存的旧版本程序集导致报错
- 可以执行
[Newtonsoft.Json.JsonConvert].Assembly.FullName验证当前加载的程序集版本,确认版本正常后再调用方法 - 读取XML文件不要用
Get-Content,该cmdlet默认按行读取、自动识别编码的逻辑很容易导致XML加载乱码、格式错误,用[IO.File]::ReadAllText()读取稳定性高很多
方案2:无第三方依赖的原生转换方案
如果不想额外引入Newtonsoft.Json依赖,可以直接用.NET内置的API完成XML到JSON的转换,不需要安装任何模块:
$filename = "E:\Udemy\Complete Guide to XML For Microsoft Developers\Lecture 5\XMLClass_Downloads_2021_03_28\IntroSamples\Flight01.xml" [xml]$xmlDoc = [System.IO.File]::ReadAllText($filename) # 先将XML反序列化为.NET对象,再序列化为JSON $xmlReader = New-Object System.Xml.XmlNodeReader($xmlDoc) $xmlSerializer = New-Object System.Xml.Serialization.XmlSerializer($xmlDoc.GetType()) $dotnetObj = $xmlSerializer.Deserialize($xmlReader) $jsonText = [System.Text.Json.JsonSerializer]::Serialize($dotnetObj, [System.Text.Json.JsonSerializerOptions]@{ WriteIndented = $true }) # 输出转换结果验证 $jsonText
内容的提问来源于stack exchange,提问作者Ken Masters
相关产品推荐
相关产品推荐

