You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:16:54