1

私のXMLファイル:

<?xml version="1.0"?>
<root>
<msg>
    <MessageError>
        <BookingID>123</BookingID>
        <Error>Invalid patient name</Error>
        <Error>PATIENT NOT FOUND</Error>
        <Message>Incoming MESSAGE DATA 1</Message>
    </MessageError>
    <MessageError>
        <BookingID>456</BookingID>
        <Error>Undefined patient account number.</Error>
        <Error>Undefined Account Number</Error>
        <Message>Incoming MESSAGE DATA 2</Message>
    </MessageError>
    <MessageError>
        <BookingID>789</BookingID>
        <Error>DOB invalid</Error>
        <Message>Incoming MESSAGE DATA 3</Message>
    </MessageError>
</msg>
</root>

私のtclスクリプト:

        set dom [dom parse $msg]
        set root [$dom documentElement]         

        set MessageError [$root selectNodes "/root/msg/MessageError" ]
        foreach node $MessageError {
            set Error [$root selectNodes {/root/msg/MessageError/Error} ]
            #set bookingid [$MessageError text]
            #echo "BookingIDXML - $bookingid"
            #set message [$MessageError text]
            #echo "MessageXML - $message"

            foreach errornode $Error {
                set error [$errornode text]
                echo "ErrorXML - $error"
            }
        }

私の出力:

ErrorXML - Invalid patient name
ErrorXML - PATIENT NOT FOUND
ErrorXML - Undefined patient account number.
ErrorXML - Undefined Account Number
ErrorXML - DOB invalid
ErrorXML - Invalid patient name
ErrorXML - PATIENT NOT FOUND
ErrorXML - Undefined patient account number.
ErrorXML - Undefined Account Number
ErrorXML - DOB invalid
ErrorXML - Invalid patient name
ErrorXML - PATIENT NOT FOUND
ErrorXML - Undefined patient account number.
ErrorXML - Undefined Account Number
ErrorXML - DOB invalid

この強力なツールに関するドキュメントはインターネット上にありません。出力を取得するにはどうすればよいですか? コードのコメント化された '#' セクションが機能しません。

BookingIDXML - 123
ErrorXML - Invalid patient name
MessageXML - Incoming MESSAGE DATA 1

BookingIDXML - 123
ErrorXML - PATIENT NOT FOUND
MessageXML - Incoming MESSAGE DATA 1

BookingIDXML - 456
ErrorXML - Undefined patient account number.
MessageXML - Incoming MESSAGE DATA 2

BookingIDXML - 465
ErrorXML - Undefined Account Number
MessageXML - Incoming MESSAGE DATA 2

BookingIDXML - 789
ErrorXML - DOB invalid
MessageXML - Incoming MESSAGE DATA 3

前もって感謝します。

4

2 に答える 2

3

このselectNodesメソッドは XPath (非常によく文書化されています) を使用して、返される結果を見つけます。コンテキスト ノードは、メソッドを呼び出すオブジェクトです。Errorしたがって、特定の のノードを見つけるにはMessageError、適切なポイントから開始する必要があります。特に、コードで次のようなことをしたいと思うでしょう:

foreach messageError [$root selectNodes "/root/msg/MessageError"] {
    # Print some general info (to separate error groups)
    set bookingID [lindex [$messageError selectNodes "BookingID"] 0]
    puts "ID: [$bookingID text]"
    set message [lindex [$messageError selectNodes "Message"] 0]
    puts "Message: [$message text]"
    # Print the errors
    foreach error [$messageError selectNodes "Error"] {
        puts "Error: [$error text]"
    }
}

./Error必要に応じて、代わりにErrorXPath 検索語として使用できます。効果は同じですが、パスのように見えます。すべきでないことは、ドキュメントのルートから検索をやり直すことです (/root/msg/MessageError/Errorそうするように)。これは、現在のサブコンテキスト内にあるビットだけでなく、そのパスに一致するすべてのものを見つけるためです。(サブコンテキストはファイルシステムの現在のディレクトリに少し似ており、要素はディレクトリに少し似ていると考えてください。これは部分的なアナロジーです — DOM ツリーディレクトリではありません — しかし、それでも少し似ています。)

于 2013-04-26T12:16:33.777 に答える
0

$errornodeコード内で DOM ノードを参照する必要があります。たとえば、次のようになります。

        foreach errornode $Error {
            set bookingid [[$errornode selectNodes "../BookingID"] text]
            set error [$errornode text]
            set message [[$errornode selectNodes "../Message"] text]
            puts "BookingIDXML - $bookingid"
            puts "ErrorXML - $error"
            puts "MessageXML - $message"
            puts ""
        }

ただし、注意してください:selectNodes複数のノードがクエリに一致する場合 (例: $errornode selectNodes "../Message")、メソッドはリストを返します。その場合は、text単一のリスト要素ごとにメソッドを使用する必要があります。

于 2013-04-26T11:58:49.920 に答える