使用PowerShell从多XML文件提取数据并生成单XML文件求助
嘿,作为PowerShell新手能写出几个脚本已经超棒了!完全不用纠结“专业能力”这事儿——咱们一步步来搞定这个XML数据提取和填充的需求~
第一步:先搞清楚XML的结构
首先得确认两个关键点:
- 你的发票XML文件里,发票编号和时间戳对应的节点路径是什么?比如可能是
<Invoice><InvoiceNumber>12345</InvoiceNumber><Timestamp>2024-05-20T14:30:00</Timestamp></Invoice>这种结构。 - 你的目标XML文件里,需要把数据填充到哪个节点下?比如目标XML可能有一个
<Invoices>父节点,需要在下面添加<Invoice>子节点,每个子节点包含编号和时间戳。
第二步:PowerShell脚本实现
我给你写一个基础版本的脚本,你可以根据自己的XML结构调整细节:
1. 读取所有发票XML文件并提取数据
# 定义发票文件所在的文件夹路径 $invoiceFolder = "C:\Your\Path\To\Invoices" # 定义目标XML文件路径 $targetXmlPath = "C:\Your\Path\To\Target\Summary.xml" # 加载目标XML文件 $targetXml = [xml](Get-Content $targetXmlPath) # 获取目标XML中用来存放发票数据的父节点(比如<Invoices>) $parentNode = $targetXml.SelectSingleNode("//Invoices") # 遍历所有发票XML文件 foreach ($file in Get-ChildItem -Path $invoiceFolder -Filter "*.xml" -Recurse) { try { # 加载当前发票XML $invoiceXml = [xml](Get-Content $file.FullName) # 提取发票编号和时间戳(这里要替换成你实际的节点路径!) $invoiceNum = $invoiceXml.Invoice.InvoiceNumber $timeStamp = $invoiceXml.Invoice.Timestamp # 如果提取到了有效数据,就添加到目标XML if ($invoiceNum -and $timeStamp) { # 创建新的<Invoice>节点 $newInvoice = $targetXml.CreateElement("Invoice") # 创建发票编号节点并赋值 $numNode = $targetXml.CreateElement("InvoiceNumber") $numNode.InnerText = $invoiceNum $newInvoice.AppendChild($numNode) | Out-Null # 创建时间戳节点并赋值 $timeNode = $targetXml.CreateElement("Timestamp") $timeNode.InnerText = $timeStamp $newInvoice.AppendChild($timeNode) | Out-Null # 将新节点添加到目标XML的父节点下 $parentNode.AppendChild($newInvoice) | Out-Null Write-Host "成功处理文件:$($file.Name)" } else { Write-Warning "文件 $($file.Name) 中未找到有效发票数据" } } catch { Write-Warning "处理文件 $($file.Name) 时出错:$_" continue # 跳过出错的文件,继续处理下一个 } } # 保存修改后的目标XML文件 $targetXml.Save($targetXmlPath) Write-Host "所有文件处理完成,目标XML已更新!"
2. 关键调整点
- 节点路径修改:一定要把脚本里的
$invoiceXml.Invoice.InvoiceNumber和$invoiceXml.Invoice.Timestamp替换成你实际XML的节点路径。比如如果你的发票XML结构是<Root><InvoiceHeader><InvNo>123</InvNo><CreateTime>2024-05-20</CreateTime></InvoiceHeader></Root>,那就要改成$invoiceXml.Root.InvoiceHeader.InvNo和$invoiceXml.Root.InvoiceHeader.CreateTime。 - 编码处理:如果你的XML文件有特殊编码(比如UTF-8带BOM、GB2312),可以在
Get-Content时指定编码,比如Get-Content $file.FullName -Encoding UTF8。 - 目标XML结构:如果你的目标XML还没有父节点(比如还没有
<Invoices>),可以先手动创建好基础结构,比如:<?xml version="1.0" encoding="UTF-8"?> <InvoiceSummary> <Invoices> <!-- 这里会自动添加发票节点 --> </Invoices> </InvoiceSummary>
小技巧:查看XML结构
如果你不确定节点路径,可以用PowerShell快速查看XML的结构:
$testXml = [xml](Get-Content "C:\Path\To\TestInvoice.xml") $testXml | Format-List *
这样就能看到整个XML的节点层级啦~
内容的提问来源于stack exchange,提问作者M Jenks
相关产品推荐
相关产品推荐

