2010-11-21 14 views
24

Aquí hay uno difícil para ti."[Error grave]: 1: 120: el objetivo de instrucción de procesamiento que coincide" [xX] [mM] [lL] "no está permitido."

estoy trabajando en un proyecto de clase, donde se crea un programa de chat peer-to-peer y tengo este problema:

Cuando abro una ventana de conversación, no hay problemas. Cuando abro una segunda ventana y tratar de iniciar sesión en la charla, me sale este error:

**[Fatal Error] :1:120: The processing instruction target matching "[xX][mM][lL]" is not allowed. 
org.xml.sax.SAXParseException: The processing instruction target matching "[xX][mM][lL]" is not allowed. 
     at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:249) 
     at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284) 
     at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124) 
     at chatter2.Chatter.process(Chatter.java:240) 
     at chatter2.Chatter.run(Chatter.java:222) 
     at java.lang.Thread.run(Thread.java:680)** 

Estoy bastante seguro de que tiene algo que ver con la forma en que mi código está creando el XML para los participantes.

Aquí es todo el código que he escrito:

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

/* 
* NewJFrame.java 
* 
* Created on Nov 10, 2010, 2:11:39 PM 
*/ 
package chatter2; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.io.StringBufferInputStream; 
import java.io.StringReader; 
import java.net.Socket; 
import java.util.LinkedList; 
import java.util.List; 
import javax.swing.DefaultListModel; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.xml.sax.InputSource; 

/** 
* 
* @author ericrea 
*/ 
public class Chatter extends javax.swing.JFrame implements Runnable { 

    PrintWriter out = null; 
    BufferedReader in = null; 
    boolean running = true; 
    String partName = ""; 
    String chatHist = ""; 

    /** Creates new form NewJFrame */ 
    public Chatter() { 
     initComponents(); 
     Server server = new Server(); 
     server.start(); 
    } 

    /** This method is called from within the constructor to 
    * initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is 
    * always regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jPanel1 = new javax.swing.JPanel(); 
     msgText = new javax.swing.JTextArea(); 
     send = new javax.swing.JButton(); 
     jPanel2 = new javax.swing.JPanel(); 
     chatText = new javax.swing.JTextArea(); 
     jPanel3 = new javax.swing.JPanel(); 
     userName = new javax.swing.JTextField(); 
     IPaddress = new javax.swing.JTextField(); 
     PortField = new javax.swing.JTextField(); 
     Login = new javax.swing.JButton(); 
     jButton1 = new javax.swing.JButton(); 
     jPanel4 = new javax.swing.JPanel(); 
     chatMembers = new javax.swing.JList(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     setMinimumSize(new java.awt.Dimension(550, 550)); 

     jPanel1.setLayout(new java.awt.GridLayout(1, 0)); 

     msgText.setColumns(20); 
     msgText.setRows(5); 
     msgText.setPreferredSize(new java.awt.Dimension(240, 24)); 
     msgText.setRequestFocusEnabled(false); 
     jPanel1.add(msgText); 

     send.setText("Send"); 
     send.setPreferredSize(new java.awt.Dimension(100, 29)); 
     send.setRolloverEnabled(true); 
     send.setSelected(true); 
     send.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       sendActionPerformed(evt); 
      } 
     }); 
     jPanel1.add(send); 

     getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_END); 

     jPanel2.setLayout(new java.awt.GridLayout(1, 0)); 

     chatText.setBackground(new java.awt.Color(0, 255, 204)); 
     chatText.setColumns(20); 
     chatText.setRows(5); 
     jPanel2.add(chatText); 

     getContentPane().add(jPanel2, java.awt.BorderLayout.LINE_END); 

     jPanel3.setLayout(new java.awt.GridLayout(1, 0)); 

     userName.setText("UserName"); 
     jPanel3.add(userName); 

     IPaddress.setText("127.0.0.1"); 
     IPaddress.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       IPaddressActionPerformed(evt); 
      } 
     }); 
     jPanel3.add(IPaddress); 

     PortField.setText("44640"); 
     jPanel3.add(PortField); 

     Login.setText("Login"); 
     Login.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       LoginActionPerformed(evt); 
      } 
     }); 
     jPanel3.add(Login); 

     jButton1.setText("Logout"); 
     jPanel3.add(jButton1); 

     getContentPane().add(jPanel3, java.awt.BorderLayout.PAGE_START); 

     chatMembers.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0))); 
     chatMembers.setModel(new javax.swing.AbstractListModel() { 
      String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; 
      public int getSize() { return strings.length; } 
      public Object getElementAt(int i) { return strings[i]; } 
     }); 
     chatMembers.setPreferredSize(new java.awt.Dimension(80, 87)); 
     jPanel4.add(chatMembers); 

     getContentPane().add(jPanel4, java.awt.BorderLayout.LINE_START); 

     pack(); 
    }// </editor-fold>       

    private void LoginActionPerformed(java.awt.event.ActionEvent evt) {          

     try { 
      Socket s = new Socket(IPaddress.getText(), Integer.parseInt(PortField.getText())); 
      out = new PrintWriter(s.getOutputStream()); 
      in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
      new Thread(this).start(); 
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder docBuilder = factory.newDocumentBuilder(); 
      Document doc = docBuilder.newDocument(); 
      Element root = doc.createElement("login"); 
      doc.appendChild(root); 
      root.appendChild(doc.createTextNode(userName.getText())); 

      TransformerFactory fact = TransformerFactory.newInstance(); 
      Transformer trans = fact.newTransformer(); 
      DOMSource source = new DOMSource(doc); 
      StreamResult sResult = new StreamResult(out); 
      trans.transform(source, sResult); 
      out.println("\n"); 

      out.flush(); 
     } catch (Exception e) { 
     } 
    }          

    private void IPaddressActionPerformed(java.awt.event.ActionEvent evt) {           
     // TODO add your handling code here: 
    }           

    private void sendActionPerformed(java.awt.event.ActionEvent evt) {          

    }          

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new Chatter().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify      
    private javax.swing.JTextField IPaddress; 
    private javax.swing.JButton Login; 
    private javax.swing.JTextField PortField; 
    private javax.swing.JList chatMembers; 
    private javax.swing.JTextArea chatText; 
    private javax.swing.JButton jButton1; 
    private javax.swing.JPanel jPanel1; 
    private javax.swing.JPanel jPanel2; 
    private javax.swing.JPanel jPanel3; 
    private javax.swing.JPanel jPanel4; 
    private javax.swing.JTextArea msgText; 
    private javax.swing.JButton send; 
    private javax.swing.JTextField userName; 
    // End of variables declaration     

    public void run() { 

     String buffer = ""; 
     while (running) { 
      try { 

       String line = in.readLine(); 
       System.out.println(line); 

       if (line.equals("")) { 

        process(buffer); 
       } else { 

        buffer = buffer + line; 
       } 
      } catch (Exception e) { 
      } 

     } 
    } 

    public void process(String buffer) { 

     try { 

      System.out.println("buffer in process is " + buffer); 
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder docBuilder = factory.newDocumentBuilder(); 
      Document doc = docBuilder.parse(new StringBufferInputStream(buffer)); //new InputSource(new StringReader(buffer)) 
      Element root = doc.getDocumentElement(); 



      if (root.getNodeName().equals("message")) { 
       chatHist = chatHist + root.getTextContent() + "\n"; 
       newMessage(); 

      } 
      else if (root.getNodeName().equals("participants")) { 
       DefaultListModel partNames = new DefaultListModel(); 
       for(int i = 0; i < root.getChildNodes().getLength(); i++){ 
        //partName = partName + root.getChildNodes().item(i).getTextContent() + "/n"; 
        partNames.addElement(root.getChildNodes().item(i).getTextContent()); 

       } 
       chatMembers.setModel(partNames); 

      } 

     } catch (Exception e) {e.printStackTrace(); 
     } 





    } 

    public void cleanStop() { 
    } 

    public void newMessage() { 
     chatText.setText(chatHist); 
    } 
} 


    /* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package chatter2; 


import java.io.*; 
import java.net.*; 
import java.util.LinkedList; 
import java.util.List; 
import org.w3c.dom.Document; 


/** 
* 
* @author ericrea 
*/ 
public class Server extends Thread { 

    private ServerSocket ss = null; 
    private List<Participant> parts = new LinkedList<Participant>(); 

    public Server(){ 
     try{ 
     ss = new ServerSocket(44640); 
     }catch(Exception e){e.printStackTrace(); 
     } 

    } 

    @Override 
    public void run() { 

     //add this into a while loop 
      while (true){ 
       try{ 
      Socket s = ss.accept(); 
      Participant p = new Participant(this, s); 
      p.start(); 
      getParts().add(p); 
      } 
      catch(Exception e){ 
      e.printStackTrace();} 





//   System.out.println(" Got a client socket connection"); 
//   PrintWriter out = new PrintWriter(s.getOutputStream()); 
//   BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
//   out.println("hey there, want to chat"); 
//   out.flush(); 
//   String line = in.readLine(); 
//   System.out.println("Client said: " + line); 


     } 

    } 
    public void message(Document doc){ 
     for (Participant p: getParts()){ 
      p.newMessage(doc); 
     } 
    } 

    public void newParticipants(){ 
     int counter = 1; 
     for(Participant p: getParts()){ 
      //System.out.println(counter + " time through the loop"); 
      counter++; 
      p.newParticipant(); 
     } 


    } 

    public void cleanStop(){ 

    } 
    public void logout(Participant p){ 
     parts.remove(p); 
     newParticipants(); 
    } 

    /** 
    * @return the ss 
    */ 
    public ServerSocket getSs() { 
     return ss; 
    } 

    /** 
    * @param ss the ss to set 
    */ 
    public void setSs(ServerSocket ss) { 
     this.ss = ss; 
    } 

    /** 
    * @return the parts 
    */ 
    public List<Participant> getParts() { 
     return parts; 
    } 

    /** 
    * @param parts the parts to set 
    */ 
    public void setParts(List<Participant> parts) { 
     this.parts = parts; 
    } 

} 


    /* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package chatter2; 

import java.io.*; 
import java.util.*; 
import java.net.*; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.xml.sax.InputSource; 

/** 
* 
* @author ericrea 
*/ 
public class Participant extends Thread { 

    Server server = null; 
    Socket client = null; 
    PrintWriter out = null; 
    BufferedReader in = null; 
    boolean running = true; 
    private String partName = null; 

    public Participant(Server server, Socket client) throws IOException { 
     this.client = client; 
     this.server = server; 
     out = new PrintWriter(client.getOutputStream()); 
     in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
    } 

    //run and actONMessage will be in the chatter class as well 
    @Override 
    public void run() { 


      String buffer = ""; 
      while (running) { 
       try { 
        String line = in.readLine(); 

        if (line.equals("")) { 

         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
         DocumentBuilder docBuilder = factory.newDocumentBuilder(); 
         Document doc = docBuilder.parse(new InputSource(new StringReader(buffer))); 
         actOnMessage(doc); 
        } else { 
         buffer = buffer + line; 
        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

    } 

    public void actOnMessage(Document doc) { 

     Element root = doc.getDocumentElement(); 


     if (root.getNodeName().equals("login")) { 
      setPartName(root.getTextContent()); 

      this.login(); 
     } else if (root.getNodeName().equals("message")) { 
      message(doc); 
     } else if (root.getNodeName().equals("logout")) { 
      this.logout(); 
     } 

    } 

    public void message(Document doc) { 
     server.message(doc); 

    } 

    public void login() { 
     server.newParticipants(); 
    } 

    public void logout() { 
     server.logout(this); 
    } 

    public void newMessage(Document doc) { 
     out.println(/*String version of the xml*/); 
    } 

    public void newParticipant() { 
     try { 

      List<Participant> partList = server.getParts(); 

      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder docBuilder = factory.newDocumentBuilder(); 
      Document doc = docBuilder.newDocument(); 
      Element root = doc.createElement("participants"); 
      doc.appendChild(root); 

      for (Participant k : partList) { 
       Element root1 = doc.createElement("participant"); 
       root.appendChild(root1); 
       root1.appendChild(doc.createTextNode(k.getPartName())); 

      } 

      TransformerFactory fact = TransformerFactory.newInstance(); 
      Transformer trans = fact.newTransformer(); 
      DOMSource source = new DOMSource(doc); 
      StreamResult sResult = new StreamResult(out); 
      trans.transform(source, sResult); 
      out.println("\n"); 

      out.flush(); 
     } catch (Exception e) { 
     } 
    } 

    public void cleanStop() { 
    } 

    public void getParticipantName() { 
    } 

    /** 
    * @return the partName 
    */ 
    public String getPartName() { 
     return partName; 
    } 

    /** 
    * @param partName the partName to set 
    */ 
    public void setPartName(String partName) { 
     this.partName = partName; 
    } 
} 
+0

El error ocurre en el paquete chatter2 que incluyó; no sabemos lo que está haciendo, lo que hace que mirar su código sea irrelevante. – BeemerGuy

+0

Chatter2 es el nombre del proyecto. – novicePrgrmr

+1

La resolución de cada una de las * tres * causas posibles de este mensaje de error está cubierta [** aquí **] (http://stackoverflow.com/a/19898942/290085). – kjhughes

Respuesta

2

Me di cuenta. Necesitaba borrar el búfer después de que se creara cada nuevo participante. duh !!!

gracias por la ayuda !!

41

El problema es que usted tiene más de una cabecera XML o el ruido antes de que uno.

El típico inicio de un documento XML ...

<?xml version='1.0'?> 

se parece a un IP, pero no lo es. Si tiene un extra, o si tiene algo más que una lista de materiales antes de uno, ese es el error que obtendrá.

+2

Un PI es una instrucción de procesamiento como en su mensaje de error. –

+0

Acabo de enterarme de que si comienzo todas las ventanas de chat antes de iniciar sesión, entonces no obtengo ese error. ¿Alguna pista de por qué? – novicePrgrmr

+0

Eric, debe dejar de pedirnos que depuremos su programa desde la parte superior y comencemos a entender su comportamiento desde abajo. – bmargulies

3

Otra respuesta a esto es usar XML dentro de XML se romperá lo necesario para no analizar el código XML interior y utilizar la etiqueta CDATA ver aquí:

http://www.w3schools.com/xml/xml_cdata.asp

es decir:

<?xml version='1.0'?> 
    <sometag> 
    <![CDATA[ 
    <?xml version='1.0'?> 
    <nonParsedTag></nonParsedTag> 
    ]]></sometag> 
15

I se enfrentó a un problema similar al implementar una aplicación web de primavera en weblogic. Tuvimos la primera línea como en blanco en el archivo xml. Esto causó el error de análisis XML con este error. ¡Después de eliminar esto, funcionó! Espero que sea información útil para los demás también .. :)

11

hay contenido no deseado puede ser el espacio de otra cosa ruidosa antes del comienzo de XML que saber:

<?xml version='1.0'?> 

Asegúrese de que no hay nada antes de la partida de tu xml Esto va a resolver el problema, Un ejemplo relacionado es:

related reference

6

me encontré con el mismo problema y lo resolvió como seguir.

El siguiente código causa error.

<?xml version="1.0" encoding="UTF-8"?> 

Así que, ¿acabo de poner un espacio antes?>.

<?xml version="1.0" encoding="UTF-8" ?> 

Después de que me gustó eso, no hubo más errores.

0

En realidad, es a causa de los contenidos no deseados, en mi caso fue porque siempre utilizar los comentarios para entender el código más tarde, así que tuve comentarios con <!-- --> antes de la <?xml version='1.0'?>

Así que sólo hay que poner los comentarios después esta línea y problema resuelto

2

Recientemente estuve trabajando en una muestra de proyecto de inicio de Spring MVC donde utilicé maven built tool. Cuando ejecuto mi servidor usando jetty obtuve este error de instrucción de procesamiento y encontré que mi web.xml tenía una etiqueta adicional antes de la etiqueta <xml> y en su lugar comenzó con la etiqueta <DOCTYPE>.

Por lo tanto, eliminado la etiqueta debajo de la cual era la etiqueta de inicio,

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > 

y tenía la etiqueta de abajo,

<?xml version="1.0" encoding="UTF-8"?> 

como la etiqueta de inicio de mi web.xml y resuelto mi problema.

Nota: Asegúrese de que no haya comentarios, etiquetas, espacios libres ni ningún carácter no deseado antes de la etiqueta <?xml ...?>. Esto arrojará principalmente este tipo de error al analizar los archivos xml.

Cuestiones relacionadas