Um die SC_REPLY-XML-Meldung zu parsen, die vom CRNP-Server als Antwort auf eine Registrierungs- oder Deregistrierungsmeldung gesendet wird, benötigen Sie eine RegReply -Helper-Klasse. Diese Klasse kann aufbauend auf einem XML-Dokument erstellt werden. Die Klasse ermöglicht den Zugang zum Statuscode und zur Statusmeldung. Um den XML-Stream vom Server zu parsen, müssen Sie ein neues XML-Dokument erstellen und die Parse-Methode dieses Dokuments verwenden. In der JAXP-Dokumentation unter http://java.sun.com/xml/jaxp/index.html wird diese Methode detailliert beschrieben.
Erstellen Sie den Java-Code, der die vorstehende Logik implementiert.
Beachten Sie, dass die readRegistrationReply-Methode die neue RegReply-Klasse verwendet.
private void readRegistrationReply(InputStream stream) throws Exception
{
// Create the document builder
DocumentBuilder db = dbf.newDocumentBuilder();
db.setErrorHandler(new DefaultHandler());
//parse the input file
Document doc = db.parse(stream);
RegReply reply = new RegReply(doc);
reply.print(System.out);
}
Implementieren Sie die RegReply-Klasse.
Beachten Sie, dass die retrieveValues-Methode der DOM-Struktur im XML-Dokument folgt und den Statuscode und die Statusmeldung abruft. Die JAXP-Dokumentation unter http://java.sun.com/xml/jaxp/index.html enthält weitere Informationen.
class RegReply
{
public RegReply(Document doc)
{
retrieveValues(doc);
}
public String getStatusCode()
{
return (statusCode);
}
public String getStatusMsg()
{
return (statusMsg);
}
public void print(PrintStream out)
{
out.println(statusCode + ": " +
(statusMsg != null ? statusMsg : ""));
}
private void retrieveValues(Document doc)
{
Node n;
NodeList nl;
String nodeName;
// Find the SC_REPLY element.
nl = doc.getElementsByTagName("SC_REPLY");
if (nl.getLength() != 1) {
System.out.println("Error in parsing: can't find "
+ "SC_REPLY node.");
return;
}
n = nl.item(0);
// Retrieve the value of the statusCode attribute
statusCode = ((Element)n).getAttribute("STATUS_CODE");
// Find the SC_STATUS_MSG element
nl = ((Element)n).getElementsByTagName("SC_STATUS_MSG");
if (nl.getLength() != 1) {
System.out.println("Error in parsing: can't find "
+ "SC_STATUS_MSG node.");
return;
}
// Get the TEXT section, if there is one.
n = nl.item(0).getFirstChild();
if (n == null || n.getNodeType() != Node.TEXT_NODE) {
// Not an error if there isn't one, so we just silently return.
return;
}
// Retrieve the value
statusMsg = n.getNodeValue();
}
private String statusCode;
private String statusMsg;
}