xml - 使用 "InsertBefore"参数 : "2" 调用 "The reference node is not a child of this node."时出现异常

标签 xml powershell

尝试将新创建的 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/

相关文章:

html - 当 <a> 埋在另一个标签中时,使用 XPath 获取它的文本,例如<强>

xml - 为什么在android中解析xml

java - 将 SOAP XML 响应写入文件

regex - 如何在 powershell 中替换为评估代码?

.net - 在Powershell中交互使用Mutexes(et al)

powershell - Close-SMBOpenFile 抛出错误并且未在 try-catch 中捕获

sql - 在 T-SQL 中解析 XML

xml - 具有不确定元素出现的 XML 文件的 XSD 验证

powershell - Connect-ServiceFabricCluster 在 "Reset local cluster"之后不起作用

powershell - 特殊字符不保存