PLSQL使用DBMS_XMLDOM解析XML文件

时间:2016-06-20 10:46:11

标签: xml plsql xmldom

我有一个简单的XML文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!--Generic Params-->
<PARAM_LIST>
    <PARAM>         
            <KEY>USERNAME</KEY>
            <VALUE>DAVID</VALUE>                        
    </PARAM>
</PARAM_LIST>

我想使用DBMS_XMLDOM解析它,我输入LOOP但是我无法从KEY标记或VALUE中获取值,而且,我甚至不确定我是否完全访问PARAM标记。

    lv_ParamList := dbms_xmldom.getElementsByTagName(lv_res_domDoc, 'PARAM_LIST');

    IF NOT dbms_xmldom.isnull(lv_ParamList) THEN

       -- Looping over parameters
       FOR lv_ParamNo IN 0..dbms_xmldom.getLength(lv_ParamList)-1 LOOP

          lv_ParamNode := dbms_xmldom.item(lv_ParamList,lv_ParamNo);
          lv_TempNode := dbms_xmldom.getNamedItem(lv_ParamAttributes,'USERNAME');
          lv_Vc2_TagValue := dbms_xmldom.getValue(dbms_xmldom.makeattr(lv_TempNode));
          lv_TempNode := dbms_xmldom.getNamedItem(lv_ParamAttributes,'KEY');
          lv_Vc2_TagValue := dbms_xmldom.getValue(dbms_xmldom.makeattr(lv_TempNode));

       END LOOP;
  END IF;

请协助。

1 个答案:

答案 0 :(得分:1)

管理如此克服它:

 FOR lv_ParamNo IN 0..dbms_xmldom.getLength(lv_ParamList)-1 LOOP

            lv_ParamNode := DBMS_XMLDOM.Item(lv_ParamList, lv_ParamNo);
            lv_ParamSet := Dbms_Xmldom.Getchildnodes(lv_ParamNode);
            lv_Num_EventId := dbms_xmldom.getLength(lv_ParamSet);

              FOR lv_ParamInNo IN 0..dbms_xmldom.getLength(lv_ParamSet)-1 LOOP
                  lv_ParamKey := Dbms_Xmldom.Item(lv_ParamSet,lv_ParamInNo);
                  lv_Vc2_DeviceName := Dbms_Xmldom.Getnodename(lv_ParamKey);
                  lv_TempNode := Dbms_Xmldom.Getfirstchild(lv_ParamKey);
                  lv_Vc2_KeyTagName := Dbms_Xmldom.Getnodevalue(lv_TempNode);
                  IF lv_Vc2_KeyTagName = 'USERNAME' THEN
                    lv_ParamKey := Dbms_Xmldom.Item(lv_ParamSet,lv_ParamInNo+1);
                    lv_Vc2_TagName := Dbms_Xmldom.Getnodename(lv_ParamKey);
                    lv_TempNode := Dbms_Xmldom.Getfirstchild(lv_ParamKey);
                    lv_Vc2_FulUserName := Dbms_Xmldom.Getnodevalue(lv_TempNode);
                  ELSIF lv_Vc2_KeyTagName = 'ADDRESS' THEN
                    lv_ParamKey := Dbms_Xmldom.Item(lv_ParamSet,lv_ParamInNo+1);
                    lv_Vc2_TagName := Dbms_Xmldom.Getnodename(lv_ParamKey);
                    lv_TempNode := Dbms_Xmldom.Getfirstchild(lv_ParamKey);
                    lv_Vc2_Address := Dbms_Xmldom.Getnodevalue(lv_TempNode);
                  END IF; 
              END LOOP;
         END LOOP;

这意味着我为每个PARAM节点迭代XML。 对于每个这样的节点,我迭代KEY VALUE对,得到KEY并移动(在内循环中)到相关值。 一个小的缺点是我迭代KEY - &gt;内环获得VALUE,迭代VALUE - &gt;转到下一个键。