Mam maly problem z parsowaniem pliku XML.
Wszystko ladnie dziala dopoki mam jeden atrybut w childzie, ale kiedy sa dwa lub wiecej funkcja hasAttributes() zwraca false.
XML ktory chce sparsowac :
<message type="gameInfoResponse">
<gameInfo playersMin="[int>1]" playersMax="[int>=playersMin]"/>
</message>>
nie moge z niego wyciagnac playersMin ani playersMax.
Moj kod parsera wyglada tak :
public class ServerXmlMessageParser {
private XmlMessageGenerator generator = new XmlMessageGenerator();
private NamedNodeMap map = null;
/**** Parse Message ****/
public String parseMessage(String xmlString) {
Node thisMessage = null;
String messageType = null;
String ret = null;
NamedNodeMap nnm = null;
String playersMin = null;
String playersMax = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(
xmlString.getBytes()));
if (document.hasChildNodes()) {
thisMessage = document.getFirstChild();
if (thisMessage.hasAttributes()) {
map = thisMessage.getAttributes();
Node typ = map.getNamedItem("type");
System.out.println("\nServer Recieved "
+ typ.getNodeValue());
messageType = typ.getNodeValue();
A tutaj kod samej obslugi wiadomosci, gdy child ma wiecej niz jeden atrybut - jak pisalem wyrzuca ">message/gameInfo< has no attributes":
/**** gameInfoResponse ****/
else if (messageType.contentEquals("gameInfoResponse")) {
/*
<!-- game info sent by player -->
<message type="gameInfoResponse">
<gameInfo playersMin="[int>1]" playersMax="[int>=playersMin]"/>
</message>
*/
if (thisMessage.hasChildNodes()) {
if (thisMessage.getFirstChild().hasAttributes()){
nnm = thisMessage.getFirstChild().getAttributes();
Node max = nnm.getNamedItem("playersMax");
playersMax = max.getNodeValue();
try {
Integer.valueOf(playersMax);
} catch (NumberFormatException e) {
ret = "playersMax must be an integer value";
System.out.println(ret);
return ret;
}
Node min = nnm.getNamedItem("playersMin");
playersMin = min.getNodeValue();
try {
Integer.valueOf(playersMin);
} catch (NumberFormatException e) {
ret = "playersMin must be an integer value";
System.out.println(ret);
return ret;
}
ret = "Rules: Minimum players - " + playersMin
+ "Maximum players - " + playersMax;
System.out.println(ret);
} else {
ret = ">message/gameInfo< has no attributes";
System.out.println(ret);
}
} else {
ret = ">Message/"
+ messageType + "< has no children";
System.out.println(ret);
}
return ret;
}
I jeszcze dla przykladu dzialajacy poprawnie kod obslugujacy message z childami z jednym atrybutem:
/**** initiationOfferResponse ****/
else if (messageType.contentEquals("initiationOfferResponse")) {
/*
<!-- initiation offer response from player -->
<!-- lack of answer means accept="no" -->
<message type="initiationOfferResponse">
<response accept="yes/no"/>
</message>
*/
if (thisMessage.hasChildNodes()){
Node child = thisMessage.getFirstChild();
if(child.hasAttributes()){
nnm = child.getAttributes();
Node acc = nnm.getNamedItem("accept");
if (acc.getNodeValue().contentEquals("yes")){
ret = "We have new game initiator";
System.out.println(ret);
} else {
ret = "Initiator rejected";
System.out.println(ret);
}
} else {
ret = ">Message/response< has no attributes";
System.out.println(ret);
}
} else {
ret = ">Message/"
+ messageType + "< has no children";
System.out.println(ret);
}
return ret;
}
Siedze nad tym problemem juz kilka dni, pomozcie jesli mozecie...