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 中(它们没有命名空间)。至于例外,你打电话getElementText两次。此方法不是纯粹的 getter,它还将阅读器推进到结束元素(根据其Javadoc)。

于 2012-04-14T06:58:58.337 回答
1

正如 Marko 所暗示的,异常是由于getElementText()连续调用两次。

如果我改变这个:

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

如果我getAttributeValue调用更改为 usenull而不是ns,如下所示:

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 回答