我有下面的soap消息。我想提取Id和chargeBoxIdentity元素。
ID: 2
Address: http://localhost:8080/ocppserver/services/CentralSystemService
Encoding: UTF-8
Http-Method: POST
Content-Type: application/soap+xml;charset=UTF-8;action="/Authorize"
Headers: {accept-encoding=[gzip,deflate], connection=[Keep-Alive], Content-Length= [852], content-type=[application/soap+xml;charset=UTF-8;action="/Authorize"], host=[localhost:8080], user-agent=[Apache-HttpClient/4.1.1 (java 1.5)]}
Payload: <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<h:chargeBoxIdentity xmlns:h="urn://Ocpp/Cs/2012/06/" xmlns="urn://Ocpp/Cs/2012/06/">REE001</h:chargeBoxIdentity>
<a:From>
<a:Address>http://127.0.0.1:8081/ChargeBox/Ocpp</a:Address>
</a:From>
<a:MessageID>urn:uuid:2ae9d933-4f92-4628-84fe-35024a858450</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:Action>/Authorize</a:Action></s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<authorizeRequest xmlns="urn://Ocpp/Cs/2012/06/">
<idTag>EF1234</idTag>
</authorizeRequest>
</s:Body>
</s:Envelope>
我在下面写了拦截器.Below拦截器打印Header和payload字段。如何提取Id?如何从有效载荷中提取chargeboxIdentity?我正在使用log4j框架。
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.Phase;
public class InBoundMessage extends AbstractSoapInterceptor {
public InBoundMessage() {
super(Phase.RECEIVE);
}
public void handleMessage(SoapMessage message) throws Fault {
Map<String, List<String>> headers = CastUtils.cast((Map)message.get(Message.PROTOCOL_HEADERS));
if (headers != null) {
Set<Entry<String,List<String>>> hashSet=headers.entrySet();
for(Entry<String,List<String>> entry:hashSet ) {
System.out.println("Key="+entry.getKey()+", Value="+entry.getValue());
}
}
System.out.println("Message id = "+message.getId());
try{
InputStream is = message.getContent ( InputStream.class );
CachedOutputStream os = new CachedOutputStream ( );
IOUtils.copy ( is, os );
os.flush();
message.setContent ( InputStream.class, os.getInputStream ( ) );
is.close();
String payload=IOUtils.toString ( os.getInputStream ( ) );
System.out.println ("The request is: " + payload);
}catch(Exception e){
e.printStackTrace();
}
}
}
答案 0 :(得分:0)
我使用SAX解析器解析了soap消息。
import java.io.StringReader;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ParseInBoundSoapMessage {
private static InBoundSoapMessage inBoundSoapMessage=null;
public static InBoundSoapMessage getInBoundSoapMessage(String xml) {
try {
inBoundSoapMessage=new InBoundSoapMessage();
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean ischargeBoxIdentityPresent = false;
boolean isAddressPresent = false;
boolean isFromPresent=false;
boolean isActionPresent=false;
boolean isMessageID=false;
boolean isRelatesTo=false;
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (localName.equals("chargeBoxIdentity")) {
ischargeBoxIdentityPresent = true;
}
if (localName.equals("From")) {
isFromPresent = true;
}
if (localName.equals("Address")) {
isAddressPresent = true;
}
if(localName.equals("Action")){
isActionPresent=true;
}
if(localName.equals("MessageID")){
isMessageID=true;
}
if(localName.equals("RelatesTo")){
isRelatesTo=true;
}
}
public void characters(char ch[], int start, int length) throws SAXException {
if (ischargeBoxIdentityPresent) {
inBoundSoapMessage.setChargeBoxIdentity(new String(ch, start, length));
ischargeBoxIdentityPresent = false;
}
if(isAddressPresent && isFromPresent){
inBoundSoapMessage.setAddressInFrom(new String(ch, start, length));
isAddressPresent = false;
isFromPresent=false;
}
if(isActionPresent){
inBoundSoapMessage.setAction(new String(ch, start, length));
isActionPresent=false;
}
if(isMessageID){
inBoundSoapMessage.setMessageId(new String(ch, start, length));
isMessageID=false;
}
if(isRelatesTo){
inBoundSoapMessage.setRelatesTo(new String(ch, start, length));
isRelatesTo=false;
}
}
};
saxParser.parse(new InputSource(new StringReader(xml)), handler);
} catch (Exception e) {
e.printStackTrace();
}
return inBoundSoapMessage;
}
}