Fortran プログラムで XML ファイルを解析する必要があります。xmlf90 パーサー ツールが自分のニーズに役立つかどうかを評価していますが、ユーザー マニュアルのサンプル問題をうまく機能させることができません。エラーは型の不一致に関係しています:
pcdata_chunk_handler=pcdata_chunk )
1
Error: Type mismatch in argument 'pcdata_chunk_handler' at (1);
passed REAL(4) to UNKNOWN
この例は、ユーザーズ マニュアルから直接コピーしました。これは、xml パーサーを呼び出すメイン プログラムです。
program inventory
use flib_sax
use m_handlers
type(xml_t) :: fxml ! XML file object (opaque)
integer :: iostat
call open_xmlfile("inventory.xml",fxml,iostat)
if (iostat /= 0) stop "cannot open xml file"
call xml_parse(fxml, begin_element_handler=begin_element, &
end_element_handler=end_element, &
pcdata_chunk_handler=pcdata_chunk )
end program inventory
これは「m_handlers」モジュールです。
module m_handlers
use flib_sax
private
!
public :: begin_element, end_element, pcdata_chunk
!
logical, private :: in_item, in_description, in_price
character(len=40), private :: what, price, currency, id
!
contains !-----------------------------------------
!
subroutine begin_element(name,attributes)
character(len=*), intent(in) :: name
type(dictionary_t), intent(in) :: attributes
integer :: status
select case(name)
case("item")
in_item = .true.
call get_value(attributes,"id",id,status)
case("description")
in_description = .true.
case("price")
in_price = .true.
call get_value(attributes,"currency",currency,status)
end select
end subroutine begin_element
!----------------------------------------------------------------
subroutine pcdata_chunk_handler(chunk)
character(len=*), intent(in) :: chunk
if (in_description) what = chunk
if (in_price) price = chunk
end subroutine pcdata_chunk_handler
!----------------------------------------------------------------
subroutine end_element(name)
character(len=*), intent(in) :: name
select case(name)
case("item")
in_item = .false.
write(unit=*,fmt="(5(a,1x))") trim(id), trim(what), ":", &
trim(price), trim(currency)
case("description")
in_description = .true.
case("price")
in_price = .false.
end select
end subroutine end_element
!----------------------------------------------------------------
end module m_handlers
私が解析する「inventory.xml」ファイルは次のとおりです。
<inventory>
<item id="003">
<description>Washing machine</description>
<price currency="euro">1500.00</price>
</item>
<item id="007">
<description>Microwave oven</description>
<price currency="euro">300.00</price>
</item>
<item id="011">
<description>Dishwasher</description>
<price currency="swedish crown">10000.00</price>
</item>
</inventory>
「call xml_parse」ステートメントから「pcdata_chunk_handler=pcdata_chunk」引数を取り除くと、このプログラムは機能しますが、もちろん、説明と価格データは出力から欠落しています。