20 #ifndef MAX_PROP_LENGTH 21 #define MAX_PROP_LENGTH 100 33 type(xml_t),
private ::
xp 68 TYPE(
xmlnode),
pointer :: XMLsubnodes(:)
70 TYPE(
eqstruct),
pointer :: eq_struct => null()
71 TYPE(
eqelement),
pointer :: eq_elements(:)
75 print *,
"Converting XML subnodes to eq_structs" 78 nodenum =
SIZE( xmlsubnodes, 1)
81 allocate( eq_elements(nodenum) )
85 print *,
"localname of the current subnode: ", trim(xmlsubnodes(idx)%localname),
" numfields: ", eq_struct%numfields
88 call assocelement( eq_elements(idx),
"subnode", eq_struct )
93 subnodes%fields = c_loc(eq_elements(1))
94 subnodes%numfields = nodenum
97 print *,
"Converting XML subnodes to eq_structs ------- finished" 114 TYPE(
eqstruct),
pointer :: eq_struct
116 TYPE(
eqelement),
pointer :: eq_elements(:)
117 TYPE(
eqstruct),
pointer :: subnodes => null()
118 character(len=:),
pointer :: value
119 integer elementnum, idx
122 print *,
"Converting XML node to eq_struct" 134 if (
ASSOCIATED(node%attrs))
then 135 elementnum = elementnum +
SIZE( node%attrs, 1 )
138 if ((
ASSOCIATED(node%subnodes)).or.(
ASSOCIATED(node%value)))
then 139 elementnum = elementnum + 1
143 if (elementnum.eq.0 )
then 147 allocate( eq_elements(elementnum) )
151 allocate(
character(len=LEN(node%localname)) ::
value )
152 value = node%localname
158 if (
ASSOCIATED(node%attrs))
then 159 do idx = 1,
SIZE( node%attrs, 1 )
160 allocate(
character(len=LEN(node%attrs(idx)%value)) ::
value )
161 value = node%attrs(idx)%value
162 call assocelement( eq_elements(idx+1), node%attrs(idx)%name,
value )
170 call assocelement( eq_elements(elementnum),
"subnodes", subnodes )
172 else if (
ASSOCIATED(node%value))
then 173 allocate(
character(len=LEN(node%value)) ::
value )
175 call assocelement( eq_elements(elementnum),
"value",
value )
180 print *,
"allocate ", trim(node%localname)
182 allocate( eq_struct )
183 eq_struct%fields = c_loc(eq_elements(1))
184 eq_struct%numfields = elementnum
187 print *,
"Converting XML node to eq_struct ------ finished" 207 TYPE(
eqstruct),
pointer :: peq_struct
216 eq_struct = peq_struct
230 subroutine read_xml( fname, fname_len, cproperty_names, numofProperties)
234 character(len=fname_len),
intent(in) :: fname
235 logical :: file_exist
236 integer numofProperties
237 TYPE(c_ptr) :: cproperty_names(numofProperties)
238 character(len=MAX_PROP_LENGTH, kind=C_CHAR),
pointer :: property_name
249 inquire(file=fname, exist=file_exist)
250 if (.not.file_exist)
then 251 print *,
'File does not exist' 256 call open_xml_file(
xp, fname, iostat=iostat)
257 if (iostat /= 0)
then 258 write(*,*)
"Cannot open file." 264 do idx = 1, numofproperties
265 call c_f_pointer( cproperty_names(idx), property_name )
270 print *,
"Property names to be retrived:" 271 do idx = 1, numofproperties
277 endElement_handler = endElement_handler, &
289 print *, new_line(
'A'), new_line(
'A'), new_line(
'A')
290 print *,
"The retrived nodes:" 293 print *, new_line(
'A'), new_line(
'A')
330 TYPE(xmlnode),
pointer :: node
331 TYPE(xmlnode),
pointer :: nodes_tmp(:)
343 allocate( nodes_tmp(nodenum) )
354 deallocate( nodes_tmp )
370 character(len=*),
intent(in) :: chunk
393 character(len=*),
intent(in) :: msg
394 print *,
"Error encountered and caught" 405 character(len=*),
intent(in) :: msg
406 print *,
"Fatal error encountered and caught" 418 character(len=*),
intent(in) :: chunk
420 character(len=len(chunk)+1),
pointer :: value
433 allocate(
character(len=len(chunk)+1) :: currentNode%
value )
434 currentnode%value = trim(chunk)
436 print *,
"assigning value to the currentNode: ", trim(currentnode%value)
454 character(len=*),
intent(in) :: URI
455 character(len=*),
intent(in) :: localname
456 character(len=*),
intent(in) :: name
463 print *,
"Deactivatig the current target node" 500 character(len=*),
intent(in) :: URI
501 character(len=*),
intent(in) :: localname
502 character(len=*),
intent(in) :: name
503 type(dictionary_t),
intent(in) :: attributes
506 type(xmlnode),
pointer :: parentnode
509 character(len=MAX_PROP_LENGTH),
pointer :: XML_attr_value(:)
511 TYPE( attrib ),
pointer :: attrs(:)
512 type(xmlnode),
pointer :: subnode
515 integer :: XML_attributes_num
528 print *,
"allocating subnode: ", localname
532 xml_attributes_num = getlength(attributes)
535 subnode%localname = trim(localname)
536 subnode%subnodes=> null()
537 subnode%value=> null()
538 allocate( subnode%attrs(xml_attributes_num) )
540 do idx = 1, getlength(attributes)
541 subnode%attrs(idx)%name = trim(getqname(attributes, idx))
542 subnode%attrs(idx)%value = trim(getvalue(attributes, idx))
563 character(len=*),
intent(in) :: URI
564 character(len=*),
intent(in) :: localname
565 character(len=*),
intent(in) :: name
566 type(dictionary_t),
intent(in) :: attributes
569 integer :: XML_attributes_num
572 character(len=MAX_PROP_LENGTH),
pointer :: XML_attr_value(:)
574 TYPE( attrib ),
pointer :: attrs(:)
577 if ( (localname.EQ.
"property").OR. &
578 (localname.EQ.
"propertyList") )
then 579 do idx = 1, getlength(attributes)
580 if ( (getqname(attributes, idx)==
"dictRef").OR. &
581 (getqname(attributes, idx)==
"title"))
then 582 if (
checkname( getvalue(attributes, idx) ))
then 583 xml_attributes_num = getlength(attributes)
593 print *,
"Allocating target node" 603 do idx = 1, getlength(attributes)
subroutine convert2eq_struct(eq_struct, node)
subroutine createtargetnode(URI, localname, name, attributes)
subroutine fatalerror_handler(msg)
subroutine characters_handler(chunk)
subroutine error_handler(msg)
subroutine startelement_handler(URI, localname, name, attributes)
logical function checkname(chunk)
logical, private targetnodeactive
subroutine convertsubnodes2eq_struct(subnodes, XMLsubnodes)
subroutine get_eq_structure(eq_struct, idx)
type(xmlnode), pointer currentnode
logical function hassubnodes(cXMLnode)
subroutine deallocatetargetnodes()
type(xmlnode), dimension(:), pointer targetnodes
subroutine printnodewithsubnodes(node)
subroutine endelement_handler(URI, localname, name)
type(xmlnode), pointer currenttargetnode
character(len=max_prop_length, kind=c_char), dimension(:), pointer property_names
integer, private subnodelevel
subroutine addtargetnode(node)
subroutine read_xml(fname, fname_len, cproperty_names, numofProperties)