2010-11-21 2 views
24

Hier ist eine schwierige für Sie."[Fataler Fehler]: 1: 120: Das Ziel des Verarbeitungsbefehls" [xX] [mM] [lL] "ist nicht erlaubt."

ich auf einem Klasse-Projekt arbeite, wo ich ein Peer-to-Peer-Chat-Programm erstellen und ich habe dieses Problem:

Wenn ich ein Chat-Fenster öffnen, keine Probleme. Wenn ich ein zweites Fenster öffnen und versuchen, mit dem IRC anmelden, ich diesen Fehler:

**[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)** 

Ich bin ziemlich sicher, dass es etwas mit dem zu tun hat, wie mein Code die XML für die Teilnehmer erstellt.

Hier ist der gesamte Code habe ich geschrieben:

/* 
* 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

Der Fehler tritt in dem von Ihnen eingeschlossenen Paket chatter2 auf. Wir wissen nicht, was das macht, und machen es unwichtig, Ihren Code zu betrachten. – BeemerGuy

+0

Chatter2 ist der Projektname. – novicePrgrmr

+1

Die Lösung jeder der drei möglichen Ursachen für diese Fehlermeldung ist [** hier **] (http://stackoverflow.com/a/19898942/290085). – kjhughes

Antwort

2

Ich fand es heraus. Ich musste den Puffer löschen, nachdem jeder neue Teilnehmer erstellt wurde. Duh !!!

danke für die hilfe !!

41

Das Problem ist, dass Sie mehr als ein XML-Header oder Rauschen, bevor eine haben.

Der typische Beginn eines XML-doc ...

<?xml version='1.0'?> 

sieht aus wie ein PI, ist aber nicht. Wenn Sie ein Extra haben oder wenn Sie etwas anderes als eine Stückliste vor einem haben, ist das der Fehler, den Sie bekommen.

+2

Ein PI ist eine Verarbeitungsanweisung wie in Ihrer Fehlermeldung. –

+0

Ich habe gerade herausgefunden, dass ich diesen Fehler nicht erhalte, wenn ich alle Chat-Fenster starte, bevor ich die Chatter einlogge. Irgendein Hinweis warum? – novicePrgrmr

+0

Eric, Sie müssen aufhören, uns zu bitten, Ihr Programm von oben zu debuggen und Verständnis dessen Verhalten von unten zu beginnen. – bmargulies

3

Eine andere Antwort auf diese Frage wird XML in XML finden Sie die innere XML und verwenden Sie die CDATA-Tag nicht analysieren brechen müssen sehen hier:

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

dh:

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

I konfrontiert ähnliches Problem bei der Bereitstellung einer Feder Webapp auf Weblogic. Wir hatten erste Zeile als leere in XML-Datei. Dies führte zu einem Fehler bei der XML-Analyse mit diesem Fehler. Nach dem Entfernen hat es funktioniert !! Hoffe, dass es nützliche Informationen ist auch für andere .. :)

11

Es gibt unerwünschte Inhalte Raum anderer vor dem Start laut Sache sein kann von Ihnen nämlich xml:

<?xml version='1.0'?> 

Vergewissern Sie sich nichts vor dem Start gibt es von deinem xml. Dadurch wird das Problem zu lösen, Ein ähnliches Beispiel ist:

related reference

6

Ich traf das gleiche Problem und ich gelöst wie folgt.

Der folgende Code verursacht einen Fehler.

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

Also, ich habe einfach einen Platz vor?>.

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

Nachdem ich das tat, gab es keinen Fehler mehr.

0

Es tatsächlich wegen unerwünschter Inhalte ist in meinem Fall war es, weil ich den Code immer Kommentare und später für das Verständnis so hatte ich Kommentare mit <!-- --> vor dem <?xml version='1.0'?>

So Kommentare nur diese Zeile nach setzen und Problem gelöst!

2

Ich arbeitete vor kurzem an einem Spring MVC Startprojekt Beispiel, wo ich maven gebaut Werkzeug verwendet. Wenn ich meinen Server mit Jetty starte, bekam ich diese Verarbeitungsanweisung und ich fand, dass mein web.xml ein zusätzliches Tag vor dem <xml> Tag hatte und stattdessen mit dem <DOCTYPE> Tag begann.

So entfernte ich den folgenden Tag, das der Start-Tag, war

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

und hatte den unten Tag,

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

als Starttag meines web.xml und es ist mein Problem gelöst.

Hinweis: Bitte stellen Sie sicher, dass vor dem Tag <?xml ...?> keine Kommentare, Tags, Leerzeichen oder andere unerwünschte Zeichen vorhanden sind. Dies wird hauptsächlich diese Art von Fehler beim Parsen der XML-Dateien auslösen.

Verwandte Themen