0

xmlstreamreader属性値やその他のデータを読み取るためにJavaで使用しています。これは xml 文字列です。

<?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、および要素 Issuer を読み取ろうとしました。上記の文字列では、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());
        }
    }
}


しかし、次の出力が得られます。

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


どうした?

4

2 に答える 2

2

属性に ns を使用していますが、属性は実際には null ns にあります (名前空間がありません)。例外については、getElementText2 回呼び出しています。このメソッドは純粋な getter ではなく、リーダーを最後の要素に進めます (そのJavadocに従って)。

于 2012-04-14T06:58:58.337 に答える
1

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

これを変更すると:

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

これに:

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

次に、次の出力が得られます。

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

の代わりに使用する呼び出し変更すると、次のようになります。getAttributeValuenullns

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

私は得る:

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

これは、元の XML を使用しています。

于 2012-04-14T07:34:16.057 に答える