1 | module m_dom_parse |
---|
2 | |
---|
3 | use m_dom_types |
---|
4 | use m_dom_element |
---|
5 | use m_dom_document |
---|
6 | use m_dom_node |
---|
7 | ! use m_dom_namednodemap |
---|
8 | use m_dom_debug |
---|
9 | |
---|
10 | use flib_sax |
---|
11 | |
---|
12 | implicit none |
---|
13 | |
---|
14 | private |
---|
15 | |
---|
16 | public :: parsefile |
---|
17 | |
---|
18 | type(fnode), pointer, private, save :: main |
---|
19 | type(fnode), pointer, private, save :: current |
---|
20 | |
---|
21 | |
---|
22 | CONTAINS |
---|
23 | |
---|
24 | subroutine begin_element_handler(name,attrs) |
---|
25 | |
---|
26 | character(len=*), intent(in) :: name |
---|
27 | type(dictionary_t), intent(in) :: attrs |
---|
28 | |
---|
29 | type(fnode), pointer :: temp |
---|
30 | character(len=400) :: attr_name, attr_value |
---|
31 | integer :: status |
---|
32 | integer :: i |
---|
33 | |
---|
34 | if (dom_debug) print *, "Adding node for element: ", name |
---|
35 | |
---|
36 | temp => createElement(name) |
---|
37 | current => appendChild(current,temp) |
---|
38 | ! |
---|
39 | ! Add attributes |
---|
40 | ! |
---|
41 | do i = 1, len(attrs) |
---|
42 | call get_name(attrs, i, attr_name, status) |
---|
43 | call get_value(attrs, attr_name, attr_value, status) |
---|
44 | if (dom_debug) print *, "Adding attribute: ", & |
---|
45 | trim(attr_name), ":",trim(attr_value) |
---|
46 | call setAttribute(current,attr_name,attr_value) |
---|
47 | enddo |
---|
48 | |
---|
49 | end subroutine begin_element_handler |
---|
50 | |
---|
51 | !--------------------------------------------------------- |
---|
52 | |
---|
53 | subroutine end_element_handler(name) |
---|
54 | character(len=*), intent(in) :: name |
---|
55 | |
---|
56 | !!AG for IBM type(fnode), pointer :: np |
---|
57 | |
---|
58 | if (dom_debug) print *, "End of element: ", name |
---|
59 | !!AG for IBM np => getParentNode(current) |
---|
60 | !!AG for IBM current => np |
---|
61 | current => getParentNode(current) |
---|
62 | end subroutine end_element_handler |
---|
63 | |
---|
64 | !--------------------------------------------------------- |
---|
65 | |
---|
66 | subroutine pcdata_chunk_handler(chunk) |
---|
67 | character(len=*), intent(in) :: chunk |
---|
68 | |
---|
69 | type(fnode), pointer :: temp, dummy |
---|
70 | |
---|
71 | if (dom_debug) print *, "Got PCDATA: |", chunk, "|" |
---|
72 | |
---|
73 | temp => createTextNode(chunk) |
---|
74 | dummy => appendChild(current,temp) |
---|
75 | |
---|
76 | end subroutine pcdata_chunk_handler |
---|
77 | |
---|
78 | !--------------------------------------------------------- |
---|
79 | |
---|
80 | subroutine comment_handler(comment) |
---|
81 | character(len=*), intent(in) :: comment |
---|
82 | |
---|
83 | type(fnode), pointer :: temp, dummy |
---|
84 | |
---|
85 | if (dom_debug) print *, "Got COMMENT: |", comment, "|" |
---|
86 | |
---|
87 | temp => createComment(comment) |
---|
88 | dummy => appendChild(current,temp) |
---|
89 | |
---|
90 | end subroutine comment_handler |
---|
91 | !--------------------------------------------------------- |
---|
92 | subroutine cdata_section_handler(chunk) |
---|
93 | character(len=*), intent(in) :: chunk |
---|
94 | |
---|
95 | type(fnode), pointer :: temp, dummy |
---|
96 | |
---|
97 | if (dom_debug) print *, "Got CDATA_SECTION: |", chunk, "|" |
---|
98 | |
---|
99 | temp => createCdataSection(chunk) |
---|
100 | dummy => appendChild(current,temp) |
---|
101 | |
---|
102 | end subroutine cdata_section_handler |
---|
103 | |
---|
104 | !*************************************************** |
---|
105 | ! PUBLIC PROCEDURES |
---|
106 | !*************************************************** |
---|
107 | |
---|
108 | |
---|
109 | function parsefile(filename, verbose, sax_verbose) |
---|
110 | |
---|
111 | character(len=*), intent(in) :: filename |
---|
112 | logical, intent(in), optional :: verbose |
---|
113 | logical, intent(in), optional :: sax_verbose |
---|
114 | |
---|
115 | type(fnode), pointer :: parsefile |
---|
116 | |
---|
117 | logical :: sax_debug = .false. |
---|
118 | |
---|
119 | type(xml_t) :: fxml |
---|
120 | integer :: iostat |
---|
121 | |
---|
122 | if (present(verbose)) then |
---|
123 | dom_debug = verbose |
---|
124 | endif |
---|
125 | |
---|
126 | if (present(sax_verbose)) then |
---|
127 | sax_debug = sax_verbose |
---|
128 | endif |
---|
129 | |
---|
130 | call open_xmlfile(filename, fxml, iostat) |
---|
131 | |
---|
132 | PRINT *,'filename : ',filename |
---|
133 | if (iostat /= 0) then |
---|
134 | stop "Cannot open file." |
---|
135 | endif |
---|
136 | |
---|
137 | main => createDocumentNode() |
---|
138 | current => main |
---|
139 | |
---|
140 | call xml_parse(fxml, & |
---|
141 | begin_element_handler, end_element_handler, pcdata_chunk_handler, & |
---|
142 | comment_handler, cdata_section_handler=cdata_section_handler, & |
---|
143 | verbose = sax_debug) |
---|
144 | call close_xmlfile(fxml) |
---|
145 | |
---|
146 | parsefile => main |
---|
147 | if (dom_debug) print *, "Number of allocated nodes: ", getNumberofAllocatedNodes() |
---|
148 | |
---|
149 | end function parsefile |
---|
150 | |
---|
151 | |
---|
152 | END MODULE m_dom_parse |
---|