【发布时间】:2022-01-25 06:10:49
【问题描述】:
我正在执行一个 PS 脚本来读取 xml 的内容,更新一些标签值并将内容存储到多个 xml 文件中。我能够实现所有这些,但是创建的 xml 文件没有被传递到的消息队列正确读取。但是当我打开它并单击保存而不对数据进行任何更改时,相同的 xml 文件在队列中工作。我比较了两个文件 1 - 创建后 2 - 打开相同文件并单击保存后,它们是相同的! 我终其一生都无法弄清楚出了什么问题以及如何解决它。
如何创建可读格式的输出 xml 文件?不确定当我在 xml 文件上单击“保存”时会发生什么变化。请帮忙。
输入 CASH.XML:
<?xml version="1.0" encoding="UTF-8"?>
<ns:POSTransaction xmlns:ns="http://schema.xyz.com/Commerce/Customer/Transaction/v1">
<ns:tranHeader>
<ns:transactionId>96846836238236142669</ns:transactionId>
<ns:businessDateTime>2021-12-25T01:10:00</ns:businessDateTime>
<ns:emailId>Perftesting002@ymail.com</ns:emailId>
</ns:tranHeader>
</ns:POSTransaction>
PS:
$log="H:\logs.txt"
[xml]$loadXML = Get-Content "H:\Q_This\CASH.XML"
try
{
$tranID = $loadXML.POSTransaction.tranHeader.transactionId.substring(17,3)
$tranIntID = [int]$tranID
$tranc = $loadXML.POSTransaction.tranHeader.transactionId.substring(0,17)
$uname = $loadXML.POSTransaction.tranHeader.emailId.substring(0,11)
$mailcnt = [int]$loadXML.POSTransaction.tranHeader.emailId.substring(11,3)
$mailend = $loadXML.POSTransaction.tranHeader.emailId.Split("@")[1]
for ($mailcnt; $mailcnt -lt 10; $mailcnt++)
{
for ([int]$i =1; $i -le 5; $i++)
{
$mailupd = ([string]($mailcnt+1)).PadLeft(3,'0')
$tranIntID = $tranIntID+1
$loadXML.POSTransaction.tranHeader.transactionId = $tranc+[string]$tranIntID
$loadXML.POSTransaction.tranHeader.emailId = $uname+$mailupd+'@'+$mailend
$fileName = "CASH_"+$tranIntID+"_"+$mailupd+".XML"
$loadXML.Save("H:\Q_This\"+$fileName)
}
}
}
catch
{
Write-Host $_.Exception.Message
Add-content $log -value ([string](Get-Date) + ' ' +$_.Exception.Message)
}
以上代码创建了 40 个输出 xml 文件:每个 emailID 来自 Performancetest003-010@ymail.com 的 5 个事务文件。但是,在我打开并单击保存(没有数据更改)之前,消息队列都没有识别到它。
【问题讨论】:
-
您是用什么打开和保存 XML 文件的?这可能是文本编码的问题吗? (UTF-8 vs ASCII等)当你说“消息队列都没有识别它”时,错误消息是什么,队列技术是什么?
-
我假设链接的副本回答了您的问题;如果没有,请告诉我们。
-
在编辑器中重新保存文件时问题消失可能是由于编辑器保存文件没有 BOM。顺便说一句:如果您的 UTF-8 编码 XML 文件 没有 有 BOM 并且您使用
Get-Content在 Windows PowerShell 中读取它,它可能是被误解(PowerShell (Core) 7+ 现在始终默认为 UTF-8)。要么使用-Encoding utf8,要么最好使用[xml]类型的.Load()方法来加载文件——参见this answer 的底部部分。 -
@mklement0 你是对的。编码是这里的问题。我在外部保存的所有文件都是 ANSI 格式,下游队列已成功读取。我从您将我重定向到的线程中尝试了几种不同的解决方案,但输出文件仍保存为 UTF-8。不确定如何转换为 XML ANSI 格式。这是我尝试过的事情(不成功) 1. ($loadXML = [xml]::new()).Load((Convert-Path "H:\CASH.XML")) 而不是 Get-Content 2。 $loadXML.Save("H:\"+$fileName) | Set-Content -LiteralPath "H:\$fileName" -Encoding Ascii #将输出文件格式更改为 ANSI
-
说得太早了!在创建输出 XML 后使用下面的行,我能够生成一个 ANSI xml 文件。我确信有更优雅的方法可以解决这个问题,但这个方法可行:') Get-Content H:\$fileName | out-file -encoding ASCII H:\new_$fileName
标签: xml powershell character-encoding xml-parsing xml-declaration