尝试将新创建的 XML 节点 INSTANCE
节点插入 MAPPING
节点时,我遇到 InsertBefore
问题。
以下是我注意到的事情:
- 如果只有一个
MAPPING
节点,则脚本可以正常工作 - 如果我调用
appendChild
,则会在第一个MAPPING
节点中创建重复项 - 我尝试使用
ParentNode
但没有成功
尝试调用InsertBefore
时发生以下错误:
Exception calling "InsertBefore" with "2" argument(s): "The reference node is not a child of this node."
这是我的脚本:
$inputPath = "C:\xml\input_file.xml"
$outputPath = "C:\output\import_files\output_file.xml"
$xmlFile = [xml](Get-Content $inputPath)
$folder = $xmlFile.SelectNodes('/POWERMART/REPOSITORY/FOLDER')[0]
$mappings = $folder.SelectNodes("//MAPPING")
ForEach ($mapping in $mappings) {
$mapping_name = $mapping.GetAttribute("NAME")
$transformations = $mapping.SelectNodes('//TRANSFORMATION')
$first_connector = $mapping.SelectSingleNode('//CONNECTOR')
ForEach ($trans in $transformations) {
$trans_name = $trans.GetAttribute('NAME')
$instance = $xmlFile.CreateElement('INSTANCE')
$dummy = $mapping.InsertBefore($instance, $mapping.SelectSingleNode('//CONNECTOR')) # using this line cause a following error: Exception calling "InsertBefore" with "2" argument(s): "The reference node is not a child of this node."
$dummy = $instance.SetAttribute('NAME', "ff_$trans_name")
}
}
$xmlFile.Save($outputPath)
Write-Output 'Done!'
XML 结构示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE POWERMART SYSTEM "powrmart.dtd"[]>
<POWERMART CREATION_DATE="19.05.2020 23:58:39" REPOSITORY_VERSION="186.95">
<REPOSITORY NAME="REP_DEV" VERSION="186" CODEPAGE="UTF-8" DATABASETYPE="Oracle">
<FOLDER NAME="SHARED_FOLDER" GROUP="" OWNER="idwbicc" SHARED="SHARED" DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="6bcbde13-cd9d-49e1-b03f-644dd335af59">
<TARGET BUSINESSNAME="" CONSTRAINT="" DATABASETYPE="Flat File" DESCRIPTION="" NAME="ff_MAPPING_NAME_Structure" OBJECTVERSION="1" TABLEOPTIONS="" VERSIONNUMBER="1">
<FLATFILE CODEPAGE="UTF-8" CONSECDELIMITERSASONE="NO" DELIMITED="YES" DELIMITERS="," ESCAPE_CHARACTER="" KEEPESCAPECHAR="NO" LINESEQUENTIAL="NO" MULTIDELIMITERSASAND="NO" NULLCHARTYPE="ASCII" NULL_CHARACTER="*" PADBYTES="1" QUOTE_CHARACTER="DOUBLE" REPEATABLE="NO" ROWDELIMITER="0" SKIPROWS="0" STRIPTRAILINGBLANKS="NO" />
<TARGETFIELD BUSINESSNAME="" DATATYPE="string" DESCRIPTION="" FIELDNUMBER="1" KEYTYPE="NOT A KEY" NAME="SUPERVISORY_ID" NULLABLE="NOTNULL" PICTURETEXT="" PRECISION="255" SCALE="0" />
<TARGETFIELD BUSINESSNAME="" DATATYPE="string" DESCRIPTION="" FIELDNUMBER="2" KEYTYPE="NOT A KEY" NAME="SUPERVISORY_CODE" NULLABLE="NULL" PICTURETEXT="" PRECISION="255" SCALE="0" />
<TABLEATTRIBUTE NAME="Datetime Format" VALUE="A 19 mm/dd/yyyy hh24:mi:ss" />
</TARGET>
</FOLDER>
<FOLDER NAME="FOLDER_NAME" GROUP="" OWNER="idwbicc" SHARED="NOTSHARED" DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="6bcbde13-cd9d-49e1-b03f-644dd335af59">
<MAPPING DESCRIPTION="" ISVALID="YES" NAME="m_MAPPING_NAME" OBJECTVERSION="1" VERSIONNUMBER="1">
<TRANSFORMATION DESCRIPTION="" NAME="sq_sc_TABLE_NAME" OBJECTVERSION="1" REUSABLE="NO" TYPE="Source Qualifier" VERSIONNUMBER="1">
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" NAME="PERNR_ID" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="255" SCALE="0" />
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" NAME="SUPERVISORY_ID" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="255" SCALE="0" />
<TABLEATTRIBUTE NAME="Sql Query" VALUE="" />
</TRANSFORMATION>
<TRANSFORMATION DESCRIPTION="" NAME="exp_EXP" OBJECTVERSION="1" REUSABLE="NO" TYPE="Expression" VERSIONNUMBER="1">
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="SUPERVISORY_ID" EXPRESSIONTYPE="GENERAL" NAME="SUPERVISORY_ID" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="255" SCALE="0" />
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="SUPERVISORY_CODE" EXPRESSIONTYPE="GENERAL" NAME="SUPERVISORY_CODE" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="255" SCALE="0" />
<TABLEATTRIBUTE NAME="Tracing Level" VALUE="Normal" />
</TRANSFORMATION>
<INSTANCE DBDNAME="ADM_READ_HR_HUB" DESCRIPTION="" NAME="sc_TABLE_NAME" TRANSFORMATION_NAME="sc_TABLE_NAME" TRANSFORMATION_TYPE="Source Definition" TYPE="SOURCE" />
<INSTANCE DBDNAME="ADM_READ_HR_HUB" DESCRIPTION="" NAME="sc_TABLE_NAME_2" TRANSFORMATION_NAME="sc_TABLE_NAME_2" TRANSFORMATION_TYPE="Source Definition" TYPE="SOURCE" />
<INSTANCE DESCRIPTION="" NAME="sc_ff_MAPPING_NAME_Structure" TRANSFORMATION_NAME="sc_ff_MAPPING_NAME_Structure" TRANSFORMATION_TYPE="Target Definition" TYPE="TARGET" />
<INSTANCE DESCRIPTION="" NAME="sc_exp_REMOVE_SPECIAL_CHARACTERS" REUSABLE="YES" TRANSFORMATION_NAME="sc_exp_REMOVE_SPECIAL_CHARACTERS" TRANSFORMATION_TYPE="Expression" TYPE="TRANSFORMATION" />
<INSTANCE DESCRIPTION="" NAME="exp_EXP" REUSABLE="NO" TRANSFORMATION_NAME="exp_EXP" TRANSFORMATION_TYPE="Expression" TYPE="TRANSFORMATION" />
<CONNECTOR FROMFIELD="PERNR_ID" FROMINSTANCE="sc_TABLE_NAME" FROMINSTANCETYPE="Source Definition" TOFIELD="PERNR_ID" TOINSTANCE="sq_sc_TABLE_NAME" TOINSTANCETYPE="Source Qualifier" />
<ERPINFO />
</MAPPING>
<MAPPING DESCRIPTION="" ISVALID="YES" NAME="m_MAPPING_NAME_2" OBJECTVERSION="1" VERSIONNUMBER="1">
<TRANSFORMATION DESCRIPTION="" NAME="sq_sc_TABLE_NAME" OBJECTVERSION="1" REUSABLE="NO" TYPE="Source Qualifier" VERSIONNUMBER="1">
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" NAME="PERNR_ID" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="255" SCALE="0" />
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" NAME="SUPERVISORY_ID" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="255" SCALE="0" />
<TABLEATTRIBUTE NAME="Sql Query" VALUE="" />
</TRANSFORMATION>
<TRANSFORMATION DESCRIPTION="" NAME="exp_EXP" OBJECTVERSION="1" REUSABLE="NO" TYPE="Expression" VERSIONNUMBER="1">
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="SUPERVISORY_ID" EXPRESSIONTYPE="GENERAL" NAME="SUPERVISORY_ID" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="255" SCALE="0" />
<TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="SUPERVISORY_CODE" EXPRESSIONTYPE="GENERAL" NAME="SUPERVISORY_CODE" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="255" SCALE="0" />
<TABLEATTRIBUTE NAME="Tracing Level" VALUE="Normal" />
</TRANSFORMATION>
<INSTANCE DBDNAME="ADM_READ_HR_HUB" DESCRIPTION="" NAME="sc_TABLE_NAME" TRANSFORMATION_NAME="sc_TABLE_NAME" TRANSFORMATION_TYPE="Source Definition" TYPE="SOURCE" />
<INSTANCE DBDNAME="ADM_READ_HR_HUB" DESCRIPTION="" NAME="sc_TABLE_NAME_2" TRANSFORMATION_NAME="sc_TABLE_NAME_2" TRANSFORMATION_TYPE="Source Definition" TYPE="SOURCE" />
<INSTANCE DESCRIPTION="" NAME="sc_ff_MAPPING_NAME_Structure" TRANSFORMATION_NAME="sc_ff_MAPPING_NAME_Structure" TRANSFORMATION_TYPE="Target Definition" TYPE="TARGET" />
<INSTANCE DESCRIPTION="" NAME="sc_exp_REMOVE_SPECIAL_CHARACTERS" REUSABLE="YES" TRANSFORMATION_NAME="sc_exp_REMOVE_SPECIAL_CHARACTERS" TRANSFORMATION_TYPE="Expression" TYPE="TRANSFORMATION" />
<INSTANCE DESCRIPTION="" NAME="exp_EXP" REUSABLE="NO" TRANSFORMATION_NAME="exp_EXP" TRANSFORMATION_TYPE="Expression" TYPE="TRANSFORMATION" />
<CONNECTOR FROMFIELD="PERNR_ID" FROMINSTANCE="sc_TABLE_NAME" FROMINSTANCETYPE="Source Definition" TOFIELD="PERNR_ID" TOINSTANCE="sq_sc_TABLE_NAME" TOINSTANCETYPE="Source Qualifier" />
<ERPINFO />
</MAPPING>
</FOLDER>
</REPOSITORY>
</POWERMART>
到目前为止我搜索过的资源:
最佳答案
//
表示 this-or-any-descendant 节点 - 但是当您使用 //NODENAME
时,没有任何限定,SelectNode()
或 SelectSingleNode
将从文档的根目录开始搜索。
在 $mappings
上进行第二次迭代时,$mapping.SelectSingleNode('//CONNECTOR')
返回 CONNECTOR
节点下的 < em>第一个 MAPPING
条目。
使用 .
限定表达式以仅搜索当前节点的后代:
$xmlFile = [xml](Get-Content $inputPath)
$folder = $xmlFile.SelectNodes('/POWERMART/REPOSITORY/FOLDER')[0]
$mappings = $folder.SelectNodes("//MAPPING")
foreach($mapping in $mappings) {
$mapping_name = $mapping.GetAttribute("NAME")
$transformations = $mapping.SelectNodes('.//TRANSFORMATION')
$first_connector = $mapping.SelectSingleNode('.//CONNECTOR')
foreach($trans in $transformations) {
$trans_name = $trans.GetAttribute('NAME')
$instance = $xmlFile.CreateElement('INSTANCE')
$dummy = $mapping.InsertBefore($instance, $mapping.SelectSingleNode('.//CONNECTOR'))
$dummy = $instance.SetAttribute('NAME', "ff_$trans_name")
}
}
关于xml - 使用 "InsertBefore"参数 : "2" 调用 "The reference node is not a child of this node."时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61990340/