2012-04-14 16 views
0

javaでxmlstreamreaderを使用して属性値やその他のデータを読み取っています。これは、XML文字列です:xmlstreamリーダを使用するとエラーが発生する

<?xml version="1.0" encoding="UTF-8" standalone="no"?><samlp:AuthnReques 
t xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" AssertionConsumerServiceURL 
="http://localhost:8080/consumer.jsp" **ID="abc"** **IssueInstant="2012-04-14T11:44:49 
:796"** ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version=" 
2.0">**<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">http://loca 
lhost:8080/saml/SProvider.jsp</saml:Issuer>**<Signature xmlns="http://www.w3.org/2 
000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.or 
g/2001/10/xml-exc-c14n#WithComments"/><SignatureMethod Algorithm="http://www.w3. 
org/2000/09/xmldsig#rsa-sha1"/><Reference URI=""><Transforms><Transform Algorith 
m="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms><DigestM 
ethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>VzKYOu1g 
ert3DDrNUSO1/Au3PGeD1PEyPuJeI2GO6ec=</DigestValue></Reference></SignedInfo><Sign 
atureValue>k7hVlbsEhGW5ryelSbrwWWyJq3cdyDuVeQCOqRilbky8hEk/1sHI9DNOvOlPZ7OC9bI4d 
EHm46R1 
CDXoXkyOoXdq+3M/HbUakHM7eNvF5+j+NUXUX9dijb/rDzq05VNHcSIDXRpvMc1IRBremi0voVqX 
ZuHRn+IBeD8hSK1LXsE=</SignatureValue></Signature></samlp:AuthnRequest> 


は、それから私は、属性ID、IssueInstant要素発行者を読み取ろうとしました。上記の文字列で3つすべてが強調表示されています(実際には**の間にあります)。私は、次のコードを使用しています

while(reader.hasNext()){ 
    reader.next(); 
    if(reader.getEventType() == XMLStreamReader.START_ELEMENT){ 

     if(reader.getLocalName().equals("AuthnRequest")) 
     { 
     String ns=reader.getNamespaceURI(); 
     System.out.println(ns); 
     id=reader.getAttributeValue(ns,"ID"); 

     rec_instant=reader.getAttributeValue(ns,"IssueInstant"); 



     System.out.println("1"+id); 
     System.out.println("2"+rec_instant); 

     } 
     else if(reader.getLocalName().equals("Issuer")) 
     { 
     rec_issuer=reader.getElementText(); 
     System.out.println("4"+reader.getElementText()); 
     } 
    } 
} 


をしかし、私はfolowing出力取得しています:

1null 
2null 
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,436] 
Message: parser must be on START_ELEMENT to read next text 


問題で何を?

+0

どの行が例外をスローしますか? –

+0

それはあなたの正確なコードですか?あなたがどこかで余分なブレースを持っているならば、私は例外を理解することができました。 –

+0

@マークビーズ:他の場合の直後の行。 – Ashwin

答えて

1

Markoが示唆しているように、例外はgetElementText()を2回続けて呼び出すことによるものです。

私はこの変更した場合:これに

String rec_issuer=reader.getElementText(); 
System.out.println("4"+reader.getElementText()); 

:私もgetAttributeValue呼び出しを変更場合

urn:oasis:names:tc:SAML:2.0:protocol 
1null 
2null 
4http://localhost:8080/saml/SProvider.jsp 

String rec_issuer = reader.getElementText(); 
System.out.println("4" + rec_issuer); 

を、私は次の出力を得ますの代わりにnullを使用してくださいは、次のように:

String id = reader.getAttributeValue(null,"ID");  
String rec_instant = reader.getAttributeValue(null,"IssueInstant"); 

私が取得:あなたのオリジナルのXMLを使用しています

urn:oasis:names:tc:SAML:2.0:protocol 
1abc 
22012-04-14T11:44:49:796 
4http://localhost:8080/saml/SProvider.jsp 

+0

あなたは好奇心から私を助けることができますか?私は[Javadoc](http://docs.oracle.com/javase/6/docs/api/javax/xml/stream/XMLEventReader)を読んでいます。html)、getAttributeValueは表示されません。どこを見ますか? –

+0

@MarkoTopolnik:あなたはXMLEventReaderを見ています - それはXMLStreamReaderにあります。 –

+0

@JonSkeet:あなたはreader.getElementText()を2回使用することについては死んでいます。ありがとう。しかし正直なところ、reader.getAttributeValue(null、 "ID");まだnullを出力します。なぜか分からない。 – Ashwin

2

属性にはnsが使用されていますが、属性は実際にはnull ns(名前空間を持たない)にあります。例外として、getElementTextを2回呼びます。このメソッドは純粋なゲッターではなく、リーダーを最後の要素に進めます(Javadoc)。

+0

大丈夫です。私はnsの代わりに "null"を入れてみました。それでも同じ出力が得られます。 – Ashwin

+0

@Ashwin:null参照の代わりに "null"を使用しましたか?作業コードについては私の答えを見てください。 –

+0

@Marko Topolnik:apiについてはhttp://docs.oracle.com/javase/6/docs/api/javax/xml/stream/XMLStreamReader.htmlを参照してください。 – Ashwin

関連する問題