powershell - 如何在powershelll中进行用户替换
问题描述
$xml = [xml](Get-Content C:\Users\ritsharma\Desktop\original.xml )
$nodes=$xml.selectnodes("/POWERMART/REPOSITORY/FOLDER/MAPPING/TRANSFORMATION/TRANSFORMFIELD[@NAME="*_DT*" or @NAME="*_NULL*"]")
$nodes -Replace '_NULL','this_is_working'
$nodes -Replace '_DT','this_is_working'
$xml.save("C:\Users\ritsharma\Desktop\original.xml")
在这里,我将向下钻取直到具有属性“NAME”的子节点“Transformfield”。我想用 'this is working' 替换具有值 '_NULL' 或 "_DT" 的属性 "NAME" 的值。此代码可以正常工作,但不提供任何输出。在文件中看不到更改。
这是xml文件
<POWERMART>
<REPOSITORY NAME="">
<FOLDER NAME="SA_Test" GROUP="" OWNER="AD" SHARED="NOTSHARED" DESCRIPTION=""
PERMISSIONS="rwx------" UUID="86fcaa4c-e96d-4eea-8263-0ee22273ee23">
<EXPRMACRO DESCRIPTION ="" EXPRESSION ="IIF( NULL_INPUT ='?' ,NULL,TO_DATE( DATE_INPUT,'MM/DD/YYYY'))" MACROTYPE ="Public" NAME ="Convert_Dates" OBJECTVERSION ="1" PROTOTYPE ="DATE/TIME Convert_Dates( NULL_INPUT as string, DATE_INPUT as string )" RETURNTYPE ="date/time" VERSIONNUMBER ="1">
<MACROARGUMENT ARGORDER ="1" DATATYPE ="string" NAME ="NULL_INPUT" PRECISION ="1" SCALE ="0"/>
<MACROARGUMENT ARGORDER ="2" DATATYPE ="string" NAME ="DATE_INPUT" PRECISION ="10" SCALE ="0"/>
</EXPRMACRO>
<MAPPING DESCRIPTION ="" ISVALID ="YES" NAME ="M_demo_1_onetoone" OBJECTVERSION ="1" VERSIONNUMBER ="1">
<TRANSFORMATION DESCRIPTION ="" NAME ="EXP_escrowfile" OBJECTVERSION ="1" REUSABLE ="NO" TYPE ="Expression" VERSIONNUMBER ="1">
<TRANSFORMFIELD DATATYPE ="string" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="Demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="1" SCALE ="0"/>
<TRANSFORMFIELD DATATYPE ="string" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="13" SCALE ="0"/>
<TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="11" SCALE ="2"/>
<TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="15" SCALE ="2"/>
<TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="3" SCALE ="2"/>
<TRANSFORMFIELD DATATYPE ="string" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="1" SCALE ="0"/>
<TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="15" SCALE ="4"/>
<TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="11" SCALE ="2"/>
<TRANSFORMFIELD DATATYPE ="string" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="ST_CHG_DT" EXPRESSIONTYPE ="GENERAL" NAME ="ST_BCB_DT" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="10" SCALE ="0"/>
<TRANSFORMFIELD DATATYPE ="string" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="ST_CHG_NULL" EXPRESSIONTYPE ="GENERAL" NAME ="ES_DISB_ST_CHG_NULL" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="1" SCALE ="0"/>
<TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="ES_E_PST_DUE_30_BA" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="15" SCALE ="2"/>
<TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="ES_E_PST_DUE_60_BA" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="15" SCALE ="2"/>
</TRANSFORMATION>
</MAPPING>
解决方案
这样做的一种方法是使用点符号来查找感兴趣的节点,循环并更改NAME
属性:
[xml]$xml = Get-Content 'C:\Users\ritsharma\Desktop\original.xml' -Raw
# unlike XPath, dot-notation works case-insensitive
$xml.POWERMART.REPOSITORY.FOLDER.MAPPING.TRANSFORMATION.TRANSFORMFIELD |
Where-Object {$_.NAME -match '_(DT|NULL)'} |
ForEach-Object {
$_.SetAttribute('NAME', $_.NAME.Replace($matches[1], 'this_is_working'))
}
$xml.Save('C:\Users\ritsharma\Desktop\updated_original.xml')
您发布的 XML 无效,因为它缺少几个结束标记。
它应该是:
<POWERMART>
<REPOSITORY NAME="">
<FOLDER NAME="SA_Test" GROUP="" OWNER="AD" SHARED="NOTSHARED" DESCRIPTION="" PERMISSIONS="rwx------" UUID="86fcaa4c-e96d-4eea-8263-0ee22273ee23">
<EXPRMACRO DESCRIPTION="" EXPRESSION="IIF( NULL_INPUT ='?' ,NULL,TO_DATE( DATE_INPUT,'MM/DD/YYYY'))" MACROTYPE="Public" NAME="Convert_Dates" OBJECTVERSION="1" PROTOTYPE="DATE/TIME Convert_Dates( NULL_INPUT as string, DATE_INPUT as string )" RETURNTYPE="date/time" VERSIONNUMBER="1">
<MACROARGUMENT ARGORDER="1" DATATYPE="string" NAME="NULL_INPUT" PRECISION="1" SCALE="0" />
<MACROARGUMENT ARGORDER="2" DATATYPE="string" NAME="DATE_INPUT" PRECISION="10" SCALE="0" />
</EXPRMACRO>
<MAPPING DESCRIPTION="" ISVALID="YES" NAME="M_demo_1_onetoone" OBJECTVERSION="1" VERSIONNUMBER="1">
<TRANSFORMATION DESCRIPTION="" NAME="EXP_escrowfile" OBJECTVERSION="1" REUSABLE="NO" TYPE="Expression" VERSIONNUMBER="1">
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="Demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="1" SCALE="0" />
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="13" SCALE="0" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="11" SCALE="2" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="2" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="3" SCALE="2" />
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="1" SCALE="0" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="4" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="11" SCALE="2" />
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="ST_CHG_DT" EXPRESSIONTYPE="GENERAL" NAME="ST_BCB_DT" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="10" SCALE="0" />
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="ST_CHG_NULL" EXPRESSIONTYPE="GENERAL" NAME="ES_DISB_ST_CHG_NULL" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="1" SCALE="0" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="ES_E_PST_DUE_30_BA" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="2" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="ES_E_PST_DUE_60_BA" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="2" />
</TRANSFORMATION>
</MAPPING>
</FOLDER>
</REPOSITORY>
</POWERMART>
使用我的答案中的代码会给你一个新的xml 文件updated_original.xml
,如下所示:
<POWERMART>
<REPOSITORY NAME="">
<FOLDER NAME="SA_Test" GROUP="" OWNER="AD" SHARED="NOTSHARED" DESCRIPTION="" PERMISSIONS="rwx------" UUID="86fcaa4c-e96d-4eea-8263-0ee22273ee23">
<EXPRMACRO DESCRIPTION="" EXPRESSION="IIF( NULL_INPUT ='?' ,NULL,TO_DATE( DATE_INPUT,'MM/DD/YYYY'))" MACROTYPE="Public" NAME="Convert_Dates" OBJECTVERSION="1" PROTOTYPE="DATE/TIME Convert_Dates( NULL_INPUT as string, DATE_INPUT as string )" RETURNTYPE="date/time" VERSIONNUMBER="1">
<MACROARGUMENT ARGORDER="1" DATATYPE="string" NAME="NULL_INPUT" PRECISION="1" SCALE="0" />
<MACROARGUMENT ARGORDER="2" DATATYPE="string" NAME="DATE_INPUT" PRECISION="10" SCALE="0" />
</EXPRMACRO>
<MAPPING DESCRIPTION="" ISVALID="YES" NAME="M_demo_1_onetoone" OBJECTVERSION="1" VERSIONNUMBER="1">
<TRANSFORMATION DESCRIPTION="" NAME="EXP_escrowfile" OBJECTVERSION="1" REUSABLE="NO" TYPE="Expression" VERSIONNUMBER="1">
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="Demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="1" SCALE="0" />
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="13" SCALE="0" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="11" SCALE="2" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="2" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="3" SCALE="2" />
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="1" SCALE="0" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="4" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="11" SCALE="2" />
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="ST_CHG_DT" EXPRESSIONTYPE="GENERAL" NAME="ST_BCB_this_is_working" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="10" SCALE="0" />
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="ST_CHG_NULL" EXPRESSIONTYPE="GENERAL" NAME="ES_DISB_ST_CHG_this_is_working" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="1" SCALE="0" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="ES_E_PST_DUE_30_BA" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="2" />
<TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="ES_E_PST_DUE_60_BA" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="2" />
</TRANSFORMATION>
</MAPPING>
</FOLDER>
</REPOSITORY>
</POWERMART>
如您所见,两个<TRANSFORMFIELD>
Name 属性已更新。
推荐阅读
- python - Keras 是否支持模型内的 if 语句?
- firebase - PERMISSION_DENIED:权限缺失或不足
- c# - DotNetBrowser:在任何查找位置都找不到包含二进制文件的程序集
- php - laravel livewire 如何调用函数值
- javascript - 在 Angular 9 中更新 CLI 生成的材料表的内容
- sql - 在 SQL Server 中:使用每个日期作为自己的列创建数据透视表
- python - 在networkx中找到最长的圆路
- java - 使用 ProcessBuilder 结果填充 JavaFX listView
- scala - 处理数据倾斜而不加盐火花中的连接键
- tensorflow - GlobalAvgPool1D 与输出大小不兼容