使用vbscript检查XML节点是否存在

时间:2014-07-07 05:18:55

标签: xml vbscript xml-parsing

这是我的XML文件

<ECSC>
<ATTRIBUTES>
     < some part of attribute section >
</ATTRIBUTES>
<SCRIPT>
  <ETXML_LINE_TABTYPE>
     <some part of script section>                 
  </ETXML_LINE_TABTYPE>
</SCRIPT>
<PARAMETERS>
  <ETPAR_GUIX>
     <item>
        <PNAME>I_LANG</PNAME>
        <PTYP>I</PTYP>
        <PINDEX>0003</PINDEX>
        <PDATLEN>0128</PDATLEN>
        <PINTTYP>C</PINTTYP>
        <PINTLEN>000128</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0001</SORT_LNR>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>WE20_100_STEP_1</PNAME>
        <PTYP>X</PTYP>
        <PDESC>WE20 - SAPMSEDIPARTNER - 100</PDESC>
        <PINDEX>0009</PINDEX>
        <PGROUP>SAPGUI</PGROUP>
        <XMLREF_TYP>G</XMLREF_TYP>
        <PSTRUC_TYP>T</PSTRUC_TYP>
        <PREF_NAME>SAPGUI</PREF_NAME>
        <PDATLEN>0000</PDATLEN>
        <PINTLEN>000000</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0001</SORT_LNR>
        <PREF_NAME2>SAPGUI</PREF_NAME2>
        <VALUE>&lt;VALUE&gt;</VALUE>
        <VAL_TYPE>T</VAL_TYPE>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>V_LANG</PNAME>
        <PTYP>V</PTYP>
        <PINDEX>0007</PINDEX>

        <PDATLEN>0128</PDATLEN>
        <PINTTYP>C</PINTTYP>
        <PINTLEN>000128</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0002</SORT_LNR>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>WE20_100_STEP_2</PNAME>
        <PTYP>X</PTYP>
        <PDESC>WE20 - SAPMSEDIPARTNER - 100</PDESC>
        <PINDEX>0010</PINDEX>
        <PGROUP>SAPGUI</PGROUP>
        <XMLREF_TYP>G</XMLREF_TYP>
        <PSTRUC_TYP>T</PSTRUC_TYP>
        <PREF_NAME>SAPGUI</PREF_NAME>
        <PDATLEN>0000</PDATLEN>
        <PINTLEN>000000</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0002</SORT_LNR>
        <PREF_NAME2>SAPGUI</PREF_NAME2>
        <VALUE>&lt;VALUE&gt;</VALUE>
        <VAL_TYPE>T</VAL_TYPE>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>I_AGENT</PNAME>
        <PTYP>I</PTYP>
        <PINDEX>0002</PINDEX>

        <PDATLEN>0128</PDATLEN>
        <PINTTYP>C</PINTTYP>
        <PINTLEN>000128</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0003</SORT_LNR>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>WE20_100_STEP_3</PNAME>
        <PTYP>X</PTYP>
        <PDESC>WE20 - SAPMSEDIPARTNER - 100</PDESC>
        <PINDEX>0011</PINDEX>
        <PGROUP>GETGUI</PGROUP>
        <XMLREF_TYP>I</XMLREF_TYP>
        <PSTRUC_TYP>T</PSTRUC_TYP>
        <PREF_NAME>GETGUI</PREF_NAME>
        <PDATLEN>0000</PDATLEN>
        <PINTLEN>000000</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0003</SORT_LNR>
        <PREF_NAME2>GETGUI</PREF_NAME2>
        <VALUE>&lt;VALUE&gt;</VALUE>
        <VAL_TYPE>T</VAL_TYPE>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>I_TYPE</PNAME>
        <PTYP>I</PTYP>
        <PINDEX>0004</PINDEX>

        <PDATLEN>0128</PDATLEN>
        <PINTTYP>C</PINTTYP>
        <PINTLEN>000128</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0004</SORT_LNR>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>WE20_100_STEP_4</PNAME>
        <PTYP>X</PTYP>
        <PDESC>WE20 - SAPMSEDIPARTNER - 100</PDESC>
        <PINDEX>0012</PINDEX>
        <PGROUP>GETGUI</PGROUP>
        <XMLREF_TYP>I</XMLREF_TYP>
        <PSTRUC_TYP>T</PSTRUC_TYP>
        <PREF_NAME>GETGUI</PREF_NAME>
        <PDATLEN>0000</PDATLEN>
        <PINTLEN>000000</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0004</SORT_LNR>
        <PREF_NAME2>GETGUI</PREF_NAME2>
        <VALUE>&lt;VALUE&gt;</VALUE>
        <VAL_TYPE>T</VAL_TYPE>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>V_AGENT</PNAME>
        <PTYP>V</PTYP>
        <PINDEX>0006</PINDEX>
        <PGROUP>I.02</PGROUP>
        <PDATLEN>0128</PDATLEN>
        <PINTTYP>C</PINTTYP>
        <PINTLEN>000128</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0005</SORT_LNR>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>WE20_100_STEP_5</PNAME>
        <PTYP>X</PTYP>
        <PDESC>WE20 - SAPMSEDIPARTNER - 100</PDESC>
        <PINDEX>0013</PINDEX>
        <PGROUP>GETGUI</PGROUP>
        <XMLREF_TYP>I</XMLREF_TYP>
        <PSTRUC_TYP>T</PSTRUC_TYP>
        <PREF_NAME>GETGUI</PREF_NAME>
        <PDATLEN>0000</PDATLEN>
        <PINTLEN>000000</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0005</SORT_LNR>
        <PREF_NAME2>GETGUI</PREF_NAME2>
        <VALUE>&lt;VALUE&gt;</VALUE>
        <VAL_TYPE>T</VAL_TYPE>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>V_TYPE</PNAME>
        <PTYP>V</PTYP>
        <PINDEX>0008</PINDEX>
        <PGROUP>V.03</PGROUP>
        <PDATLEN>0128</PDATLEN>
        <PINTTYP>C</PINTTYP>
        <PINTLEN>000128</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0006</SORT_LNR>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>WE20_100_STEP_6</PNAME>
        <PTYP>X</PTYP>
        <PDESC>WE20 - SAPMSEDIPARTNER - 100</PDESC>
        <PINDEX>0014</PINDEX>
        <PGROUP>SAPGUI</PGROUP>
        <XMLREF_TYP>G</XMLREF_TYP>
        <PSTRUC_TYP>T</PSTRUC_TYP>
        <PREF_NAME>SAPGUI</PREF_NAME>
        <PDATLEN>0000</PDATLEN>
        <PINTLEN>000000</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0006</SORT_LNR>
        <PREF_NAME2>SAPGUI</PREF_NAME2>
        <VALUE>&lt;VALUE&gt;</VALUE>
        <VAL_TYPE>T</VAL_TYPE>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>MSG_1</PNAME>
        <PTYP>X</PTYP>
        <PDESC>Rules for Message Check eCATT Command MESSAGE</PDESC>
        <PINDEX>0005</PINDEX>
        <PGROUP>MESSAGE</PGROUP>
        <XMLREF_TYP>M</XMLREF_TYP>
        <PSTRUC_TYP>T</PSTRUC_TYP>
        <PREF_NAME>ETMSG_DEF_TABTYPE</PREF_NAME>
        <PDATLEN>0000</PDATLEN>
        <PINTLEN>000000</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0007</SORT_LNR>
        <PREF_NAME2>ETMSG_DEF_TABTYPE</PREF_NAME2>
        <VAL_TYPE>T</VAL_TYPE>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>E_MSG_1</PNAME>
        <PTYP>X</PTYP>
        <PDESC>Collected Messages Before ENDMESSAGE</PDESC>
        <PINDEX>0001</PINDEX>
        <PGROUP>ENDMESSAGE</PGROUP>
        <XMLREF_TYP>N</XMLREF_TYP>
        <PSTRUC_TYP>T</PSTRUC_TYP>
        <PREF_NAME>ETMSG_RES_TABTYPE</PREF_NAME>
        <PDATLEN>0000</PDATLEN>
        <PINTLEN>000000</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0008</SORT_LNR>
        <PREF_NAME2>ETMSG_RES_TABTYPE</PREF_NAME2>
        <VAL_TYPE>T</VAL_TYPE>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
     <item>
        <PNAME>ZX_FI_FP_0569_MS07_COAS_FB_1</PNAME>
        <PTYP>X</PTYP>
        <PDESC>TF_FI_FP_FI_0569_MS07_CO_Search_Help_Internal_Orders_vTD0_1_</PDESC>
        <PINDEX>0015</PINDEX>
        <PGROUP>REF</PGROUP>
        <XMLREF_TYP>R</XMLREF_TYP>
        <PSTRUC_TYP>T</PSTRUC_TYP>
        <PREF_NAME>ZX_FI_FP_0569_MS07_COAS_FB01</PREF_NAME>
        <PDATLEN>0000</PDATLEN>
        <PINTLEN>000000</PINTLEN>
        <PDECIMALS>000000</PDECIMALS>
        <SORT_LNR>0009</SORT_LNR>
        <PREF_NAME2>ZX_FI_FP_0569_MS07_COAS_FB01</PREF_NAME2>
        <VAL_TYPE>T</VAL_TYPE>
        <TAB_INDEX>0</TAB_INDEX>
     </item>
  </ETPAR_GUIX>

我想在标签nodeName上面检查上面的XML文件是否存在..?例如<PARAMETER> <PNAME>I_LANG</PNAME>项中的<PGROUP>标记没有像<PNAME>WE20_100_STEP_1</PNAME>那样的标记或nodeName,因此在这种情况下,VB脚本应该显示错误。

对于<PGROUP>,nodeName <PNAME>标记存在,所以这是正确的这样我想检查哪个<PGROUP> <PNAME>标记不存在。

以下XML <PGROUP>节点没有对应的<PNAME>I_LANG</PNAME> 1)<PNAME>V_LANG</PNAME> 2)<PNAME>I_AGENT</PNAME> 3)<PNAME>I_TYPE</PNAME> 4)<PNAME>I_LANG</PNAME>     对于这些VB脚本应该显示错误但我尝试使用以下vb脚本它只显示 Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject") Dim sFSpec : sFSpec = oFS.GetAbsolutePathName("C:\sample.xml") Dim objMSXML : Set objMSXML = CreateObject("Msxml2.DOMDocument") objMSXML.setProperty "SelectionLanguage", "XPath" objMSXML.async = False objMSXML.load sFSpec objMSXML.validateOnParse = True counter=0 Set NodeList = objMSXML.documentElement.selectNodes("/ECSC/PARAMETERS/ETPAR_GUIX/item[not(PGROUP)]/PNAME") for each item in NodeList myPNAME = objMSXML.getElementsByTagName("PNAME").item(counter).text If (Left(myPNAME,1)="I") Then If objMSXML.getElementsByTagName("PNAME").item(counter).nodeName = "PGROUP" Then msgbox("PGROUP is exist for" &myPNAME) Else msgbox("PGROUP is NOT exist for" &myPNAME) End If End If counter=counter+1 Next 的错误而不是其他人。请帮忙

我试过跟随vbscript:

{{1}}

1 个答案:

答案 0 :(得分:0)

由于NodeList已包含没有对应<PGROUP>的节点,因此您无需再在If循环内进行For Each检查:

Set NodeList = objMSXML.documentElement.selectNodes("/ECSC/PARAMETERS/ETPAR_GUIX/item[not(PGROUP)]/PNAME")
For Each item in NodeList
  myPNAME = item.text
  msgbox("PGROUP is NOT exist for" &myPNAME)
Next