Xml 异常调用";“插入之前”;加上;2“;论点:“;引用节点不是此节点的子节点。”;
在尝试将新创建的XML节点Xml 异常调用";“插入之前”;加上;2“;论点:“;引用节点不是此节点的子节点。”;,xml,powershell,Xml,Powershell,在尝试将新创建的XML节点INSCANCE节点插入到映射节点时,我遇到了InsertBefore问题 以下是我注意到的事情: 如果只有一个映射节点,则脚本工作正常 如果调用appendChild,则会在第一个映射节点中进行重复 我尝试使用ParentNode,但没有成功 尝试调用InsertBefore时发生以下错误: 调用带有“2”参数的“InsertBefore”异常:“引用 节点不是此节点的子节点。“ 这是我的剧本: $inputPath = "C:\xml\input_file.xm
INSCANCE
节点插入到映射
节点时,我遇到了InsertBefore
问题
以下是我注意到的事情:
- 如果只有一个
节点,则脚本工作正常映射
- 如果调用
,则会在第一个appendChild
节点中进行重复映射
- 我尝试使用
,但没有成功ParentNode
InsertBefore
时发生以下错误:
调用带有“2”参数的“InsertBefore”异常:“引用
节点不是此节点的子节点。“
这是我的剧本:
$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>
到目前为止,我已经搜索了以下资源:
//
表示此节点或任何子节点-但是当您使用//NODENAME
时,如果没有任何限定条件,SelectNode()
或SelectSingleNode
将从文档的根开始搜索
在对$mappings
进行第二次迭代时,$mapping.SelectSingleNode('//CONNECTOR')
返回第一个映射
项下的连接器
节点
使用
限定表达式以仅搜索当前节点的后代:
$xmlFile=[xml](获取内容$inputPath)
$folder=$xmlFile.SelectNodes('/POWERMART/REPOSITORY/folder')[0]
$mappings=$folder.SelectNodes(“//映射”)
foreach($映射中的映射){
$mapping\u name=$mapping.GetAttribute(“名称”)
$transformations=$mapping.SelectNodes(“.//转换”)
$first\u connector=$mapping.SelectSingleNode(“.//connector”)
foreach($trans in$transformations){
$trans_name=$trans.GetAttribute('name'))
$instance=$xmlFile.CreateElement('instance')
$dummy=$mapping.InsertBefore($instance,$mapping.SelectSingleNode('.//连接器'))
$dummy=$instance.SetAttribute('NAME',“ff_u$trans_NAME”)
}
}
天哪!非常感谢你的帮助。我花了一整天的时间!