0

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」引数を取り除くと、このプログラムは機能しますが、もちろん、説明と価格データは出力から欠落しています。

4

1 に答える 1

2

xmlf90のユーザーズマニュアルのm_handlersモジュールに誤りがあります。サブルーチン「pcdata_chunk_handler」は、実際には「pcdata_chunk」という名前にする必要があります。これは、メイン プログラムにある「call xml_parse」ステートメントの引数で呼び出されるものであり、モジュール ファイルの先頭で呼び出されるものでもあるからです。 「パブリック :: begin_element、end_element、pcdata_chunk」。

于 2013-03-09T16:35:21.557 に答える