示例Test.xml,内容如下
1
2
3
4
5
6
7
8
9
10
|
<
staff
content = "name and id">
<
member
>
<
name
>Arwen</
name
>
<
eno
>123</
eno
>
</
member
>
<
member
>
<
name
>Tom</
name
>
<
eno
>456</
eno
>
</
member
>
</
staff
>
|
=============================================================
xml decode
使用xml decode方法将xml文件解析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
decode_list_enterprise_request(xmldom.item (xmldom.getElementsByTagName (req_domdoc ,
'staff'
), 0));
FUNCTION
decode_staff (p_node
IN
DBMS_XMLDOM.DOMNode )
RETURN
staff
IS
l_obj staff ;
l_children DBMS_XMLDOM.DOMNodeList ;
l_length
INTEGER
;
l_i
INTEGER
;
l_child DBMS_XMLDOM.DOMNode ;
l_name VARCHAR2 (32767);
BEGIN
l_obj := staff();
l_children := DBMS_XMLDOM.getChildNodes (p_node );
l_length := DBMS_XMLDOM.getLength (l_children );
l_i := 0;
WHILE l_i < l_length
LOOP
BEGIN
l_child := DBMS_XMLDOM.item (l_children , l_i );
IF DBMS_XMLDOM.getNodeType (l_child )!= DBMS_XMLDOM.ELEMENT_NODE
THEN
BEGIN
l_i := l_i + 1;
CONTINUE
;
END
;
END
IF;
l_name := DBMS_XMLDOM.
getLocalName (DBMS_XMLDOM.makeElement (l_child ));
IF l_name =
'member'
THEN
BEGIN
l_obj .member.
add
(decode_member(l_child ));
END
;
END
IF;
l_i := l_i + 1;
END
;
END
LOOP;
RETURN
l_obj ;
END
;
FUNCTION
decode_member (p_node
IN
DBMS_XMLDOM.DOMNode )
RETURN
member
IS
l_obj member ;
l_children DBMS_XMLDOM.DOMNodeList ;
l_length
INTEGER
;
l_i
INTEGER
;
l_child DBMS_XMLDOM.DOMNode ;
l_name VARCHAR2 (32767);
BEGIN
l_obj := member();
l_children := DBMS_XMLDOM.getChildNodes (p_node );
l_length := DBMS_XMLDOM.getLength (l_children );
l_i := 0;
WHILE l_i < l_length
LOOP
BEGIN
l_child := DBMS_XMLDOM.item (l_children , l_i );
IF DBMS_XMLDOM.getNodeType (l_child )!= DBMS_XMLDOM.ELEMENT_NODE
THEN
BEGIN
l_i := l_i + 1;
CONTINUE
;
END
;
END
IF;
l_name := DBMS_XMLDOM.
getLocalName (DBMS_XMLDOM.makeElement (l_child ));
IF l_name =
'name'
THEN
BEGIN
l_obj .
name
:= decode_string(l_child );
END
;
END
IF;
IF l_name =
'eno'
THEN
BEGIN
l_obj .eno := decode_string(l_child );
END
;
END
IF;
l_i := l_i + 1;
END
;
END
LOOP;
RETURN
l_obj ;
END
;
FUNCTION
decode_string (p_node
IN
DBMS_XMLDOM.DOMNode )
RETURN
VARCHAR2
IS
l_children DBMS_XMLDOM.DOMNodeList ;
l_length
INTEGER
;
l_i
INTEGER
;
l_child DBMS_XMLDOM.DOMNode ;
l_char_data DBMS_XMLDOM.DOMCharacterData ;
BEGIN
l_children := DBMS_XMLDOM.getChildNodes (p_node );
l_length := DBMS_XMLDOM.getLength (l_children );
l_i := 0;
WHILE l_i < l_length
LOOP
BEGIN
l_child := DBMS_XMLDOM.item (l_children , l_i );
IF DBMS_XMLDOM.getNodeType (l_child )
= DBMS_XMLDOM.TEXT_NODE
THEN
BEGIN
l_char_data := DBMS_XMLDOM.makeCharacterData (l_child );
RETURN
DBMS_XMLDOM.getData (l_char_data );
END
;
END
IF;
l_i := l_i + 1;
END
;
END
LOOP;
RETURN
''
;
END
;
|
=============================================================
xml encode
FUNCTION encode_root_staff
(p_obj IN OUT staff ) RETURN DBMS_XMLDOM.DOMDocument IS
l_response_node DBMS_XMLDOM.DOMNode ;
l_element DBMS_XMLDOM.DOMElement ;
l_node DBMS_XMLDOM.DOMNode ;
l_fcall_tmp DBMS_XMLDOM.DOMNode ;
BEGIN
XmlResponse.response_doc := DBMS_XMLDOM.newDOMDocument ();
l_response_node := encode_staff (p_obj ,'staff');
l_element := DBMS_XMLDOM.makeElement (l_response_node );
l_node := DBMS_XMLDOM.makeNode (XmlResponse.response_doc );
l_fcall_tmp := DBMS_XMLDOM.appendChild (l_node , l_response_node );
DBMS_XMLDOM.setAttribute (l_element , 'xmlns:ns2',
'http://edb.att.com/cci/v2.0')
;
DBMS_XMLDOM.setAttribute (l_element , 'xmlns:ns1',
'http://cio.att.com/CommonHeader/v2')
;
RETURN XmlResponse.response_doc ;
END;
FUNCTION encode_staff
(p_obj IN OUT staff , p_tag IN VARCHAR2 ) RETURN
DBMS_XMLDOM.DOMNode IS
l_element DBMS_XMLDOM.DOMElement ;
l_node DBMS_XMLDOM.DOMNode ;
l_fcall_tmp DBMS_XMLDOM.DOMNode ;
BEGIN
l_element := DBMS_XMLDOM.createElement (XmlResponse.response_doc ,p_tag );
l_node := DBMS_XMLDOM.makeNode (l_element );
IF p_obj IS NOT NULL THEN
BEGIN
IF p_obj .member.count >0 THEN
for i in 1..p_obj .member.count
loop
BEGIN
l_fcall_tmp := DBMS_XMLDOM.appendChild (l_node ,encode_member(p_obj .member,'member'));
END;
end loop;
END IF;
END;
END IF;
RETURN l_node ;
END;
FUNCTION encode_member
(p_obj IN OUT member , p_tag IN VARCHAR2 ) RETURN
DBMS_XMLDOM.DOMNode IS
l_element DBMS_XMLDOM.DOMElement ;
l_node DBMS_XMLDOM.DOMNode ;
l_fcall_tmp_1 DBMS_XMLDOM.DOMNode ;
l_fcall_tmp DBMS_XMLDOM.DOMNode ;
BEGIN
l_element := DBMS_XMLDOM.createElement (XmlResponse.response_doc ,p_tag );
l_node := DBMS_XMLDOM.makeNode (l_element );
IF p_obj IS NOT NULL THEN
BEGIN
IF p_obj .name IS NOT NULL THEN
BEGIN
l_fcall_tmp := DBMS_XMLDOM.appendChild (l_node ,encode_string(p_obj .name,'name'));
END;
END IF;
IF p_obj .eno IS NOT NULL THEN
BEGIN
l_fcall_tmp := DBMS_XMLDOM.appendChild (l_node ,encode_string(p_obj .eno,'eno'));
END;
END IF;
END;
END IF;
RETURN l_node ;
END;
FUNCTION encode_string (p_obj IN VARCHAR2 , p_tag IN VARCHAR2 ) RETURN
DBMS_XMLDOM.DOMNode IS
l_node4 DBMS_XMLDOM.DOMNode ;
l_fcall_tmp_1 DBMS_XMLDOM.DOMNode ;
l_fcall_tmp DBMS_XMLDOM.DOMNode ;
BEGIN
l_node4 := DBMS_XMLDOM.
makeNode (DBMS_XMLDOM.createElement (XmlResponse.response_doc ,
p_tag ));
IF p_obj IS NOT NULL THEN
BEGIN
l_fcall_tmp := DBMS_XMLDOM.appendChild (l_node4 ,
DBMS_XMLDOM.
makeNode (DBMS_XMLDOM.
createTextNode (XmlResponse.
response_doc ,
p_obj )));
END;
ELSE
BEGIN
l_fcall_tmp_1 := DBMS_XMLDOM.appendChild (l_node4 ,
DBMS_XMLDOM.
makeNode (DBMS_XMLDOM.
createTextNode (XmlResponse.
response_doc ,
' ')));
END;
END IF;
RETURN l_node4 ;
END;