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&gt;1]" playersMax="[int&gt;=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&gt;1]" playersMax="[int&gt;=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...