Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 异常调用";“插入之前”;加上;2“;论点:“;引用节点不是此节点的子节点。”;_Xml_Powershell - Fatal编程技术网

Xml 异常调用";“插入之前”;加上;2“;论点:“;引用节点不是此节点的子节点。”;

Xml 异常调用";“插入之前”;加上;2“;论点:“;引用节点不是此节点的子节点。”;,xml,powershell,Xml,Powershell,在尝试将新创建的XML节点INSCANCE节点插入到映射节点时,我遇到了InsertBefore问题 以下是我注意到的事情: 如果只有一个映射节点,则脚本工作正常 如果调用appendChild,则会在第一个映射节点中进行重复 我尝试使用ParentNode,但没有成功 尝试调用InsertBefore时发生以下错误: 调用带有“2”参数的“InsertBefore”异常:“引用 节点不是此节点的子节点。“ 这是我的剧本: $inputPath = "C:\xml\input_file.xm

在尝试将新创建的XML节点
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”)
}
}

天哪!非常感谢你的帮助。我花了一整天的时间!