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

使用PowerShell修改XML数据:更新l_nr与拆分txt节点

完整实现XML数据修改的PowerShell方案

我来帮你搞定这个XML修改需求,先明确你的原始数据和要做的操作:

原始XML示例:

<lieu> 
  <l_nr> </l_nr> 
  <strasse>gasse</strasse> 
  <h_nr>0</h_nr> 
  <f_name>0</f_name> 
  <v_name>0</v_name> 
  <txt>1 Knoflach Josef</txt> 
</lieu>

需要完成的核心操作:

  1. 将<l_nr>节点的值设置为1到6000(推测是生成6000条<lieu>记录,每条的l_nr依次从1到6000)
  2. 拆分<txt>节点的内容,把拆分后的值对应到<h_nr>、<f_name>、<v_name>节点

完整PowerShell实现代码

如果你的需求是生成6000条符合要求的<lieu>记录,下面是完整可运行的代码:

# 定义原始XML路径和输出路径
$inputPath = "lieu.xml"
$outputPath = "updated_lieux.xml"

# 加载XML文档
[xml]$xml = Get-Content $inputPath

# 处理根节点:如果原始XML只有单个<lieu>,创建根节点<lieux>来容纳多条记录
if ($xml.DocumentElement.Name -eq "lieu") {
    $rootNode = $xml.CreateElement("lieux")
    $originalLieu = $xml.DocumentElement
    $xml.ReplaceChild($rootNode, $originalLieu)
    $rootNode.AppendChild($originalLieu) | Out-Null
}

# 拆分原始<txt>的内容,获取基础值
$txtSegments = $xml.DocumentElement.lieu[0].txt.Split(" ", [StringSplitOptions]::RemoveEmptyEntries)
$baseHnr = $txtSegments[0]
$baseFamilyName = $txtSegments[1]
$baseGivenName = $txtSegments[2]

# 循环生成1到6000的<lieu>节点
for ($i = 1; $i -le 6000; $i++) {
    # 克隆原始节点作为模板
    $newLieu = $xml.DocumentElement.lieu[0].Clone()
    
    # 设置当前节点的l_nr值
    $newLieu.l_nr = $i.ToString()
    
    # 将拆分后的内容赋值到对应字段
    $newLieu.h_nr = $baseHnr
    $newLieu.f_name = $baseFamilyName
    $newLieu.v_name = $baseGivenName
    
    # 可选:移除不再需要的<txt>节点
    $newLieu.RemoveChild($newLieu.txt) | Out-Null
    
    # 将新节点添加到根节点
    $xml.DocumentElement.AppendChild($newLieu) | Out-Null
}

# 删除原始的模板节点
$xml.DocumentElement.RemoveChild($xml.DocumentElement.lieu[0]) | Out-Null

# 保存修改后的XML文件
$xml.Save($outputPath)

Write-Host "操作完成!修改后的XML已保存到: $outputPath"

简化版(仅修改单个节点)

如果你的需求只是修改单个<lieu>节点的<l_nr>为某个值(比如1),并拆分<txt>内容到对应字段,用下面的简化代码即可:

$path = "lieu.xml"
[xml]$xml = Get-Content $path

# 设置l_nr为目标值(这里设为1,可按需修改)
$xml.lieu.l_nr = "1"

# 拆分<txt>内容并赋值到对应节点
$txtParts = $xml.lieu.txt.Split(" ", [StringSplitOptions]::RemoveEmptyEntries)
$xml.lieu.h_nr = $txtParts[0]
$xml.lieu.f_name = $txtParts[1]
$xml.lieu.v_name = $txtParts[2]

# 可选:移除<txt>节点
$xml.lieu.RemoveChild($xml.lieu.txt) | Out-Null

# 保存修改
$xml.Save($path)
Write-Host "单个节点修改完成!"

关键细节说明

  • XML结构合法性:如果原始XML只有单个<lieu>节点,直接生成6000个同级节点会导致XML结构不合法,所以我们创建了<lieux>作为根节点来容纳所有记录。
  • 拆分内容的鲁棒性:使用[StringSplitOptions]::RemoveEmptyEntries可以避免因多个连续空格导致的空字符串问题。
  • 克隆节点:通过克隆原始节点作为模板,能保留<strasse>等其他字段的原始值,不需要重复设置。

内容的提问来源于stack exchange,提问作者Arenas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:39:30