首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用DBMS_XMLDOM实现PLSQL解析XML文件

用DBMS_XMLDOM实现PLSQL解析XML文件
EN

Stack Overflow用户
提问于 2016-06-20 18:46:11
回答 1查看 454关注 0票数 0

我有一个简单的XML文件,像这样:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!--Generic Params-->
<PARAM_LIST>
    <PARAM>         
            <KEY>USERNAME</KEY>
            <VALUE>DAVID</VALUE>                        
    </PARAM>
</PARAM_LIST>

我想使用DBMS_XMLDOM解析它,我进入循环,但我无法从nor键标记或值获得值,而且,我甚至不确定我是否完全访问PARAM标记。

代码语言:javascript
复制
    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;

请协助。

EN

回答 1

Stack Overflow用户

发布于 2016-06-20 23:43:26

就像这样克服了它:

代码语言:javascript
复制
 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。对于每个这样的节点,我迭代键值对,获得键并(在内部循环中)移动到相关值。一个小的缺点是,我迭代键,内部循环得到值,迭代值,移动到下一个键。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37920539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档