2010-11-21 6 views
24

Oto trudny dla ciebie."[Błąd krytyczny]: 1: 120: Cel instrukcji przetwarzania zgodny z" [xX] [mM] [lL] "jest niedozwolony."

Pracuję nad projektem klasy gdzie tworzę program czat peer-to-peer i mam ten problem:

Kiedy otworzy się okno rozmowy, żadnych problemów. Kiedy otworzy się drugie okno i spróbować zalogować się na czacie, otrzymuję ten błąd:

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

Jestem pewien, że ma coś wspólnego z tym, jak mój kod jest tworzenie XML dla uczestników.

Oto cały kod Pisałem:

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

Błąd pojawia się w pakiecie chatter2, który zawierasz; nie wiemy, co to robi, sprawiając, że patrzenie na twój kod nie ma znaczenia. – BeemerGuy

+0

Chatter2 to nazwa projektu. – novicePrgrmr

+1

Rozdzielczość każdego z trzech * możliwych przyczyn tego komunikatu o błędzie jest objęta [** tutaj **] (http://stackoverflow.com/a/19898942/290085). – kjhughes

Odpowiedz

2

Wymyśliłem to. Musiałem wyczyścić bufor po utworzeniu każdego nowego uczestnika. duh !!!

dzięki za pomoc !!

41

Problemem jest to, że masz więcej niż jeden nagłówek XML lub hałas przed jednym.

Typowy początek o doc XML ...

<?xml version='1.0'?> 

wygląda PI, ale nie jest. Jeśli masz coś ekstra, lub masz przed sobą coś innego niż BOM, to dostaniesz błąd.

+2

PI jest instrukcją przetwarzania, jak w komunikacie o błędzie. –

+0

Właśnie się dowiedziałem, że jeśli uruchomię wszystkie okna czatu przed zalogowaniem się, to nie otrzymam tego błędu. Jakąkolwiek wskazówkę dlaczego? – novicePrgrmr

+0

Eric, musisz przestać prosić nas o debugowanie twojego programu od początku i zaczynać zrozumienie jego zachowania od dołu. – bmargulies

3

Inną odpowiedzią na to jest za pomocą XML w XML złamie trzeba nie analizować wewnętrzną XML i użyć tagu CDATA zobaczyć tutaj:

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

tj:

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

I napotkał podobny problem przy wdrażaniu wiosennego webappu na weblogic. W pliku xml mieliśmy pierwszą linię jako pustą . Spowodowało to niepowodzenie parsowania XML z tym błędem. Po usunięciu tego zadziałało !! Nadzieję, że to przydatne informacje dla innych zbyt .. :)

11

Jest niechciane treści może być przestrzeń innych hałaśliwych rzeczy przed uruchomieniem z was xml mianowicie:

<?xml version='1.0'?> 

Upewnij się, nic nie stoi przed rozruchem twojego xml. To rozwiąże problem, Jednym z przykładów jest powiązany:

related reference

6

I napotkał ten sam problem i jak mogę rozwiązać następujący.

Następujący błąd kodu.

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

Po prostu po prostu wstawiłem spację?>.

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

Po tym, jak mi się to podobało, nie było więcej błędów.

0

To jest rzeczywiście z powodu niechcianych treści, w moim przypadku to dlatego, że zawsze używać komentarzy do zrozumienia kod później tak miałem komentarzy z <!-- --> przed <?xml version='1.0'?>

Więc wystarczy umieścić komentarze po tej linii i problem rozwiązany!

2

Niedawno pracowałem nad próbą startową w ramach projektu Spring MVC, w której użyłem narzędzia skonstruowanego przez maven. Kiedy uruchomiłem swój serwer za pomocą pomostu, otrzymałem ten błąd instrukcji przetwarzania i odkryłem, że mój web.xml miał dodatkowy tag przed tagiem <xml> i zamiast tego zaczynał się od tagu <DOCTYPE>.

Więc usunąłem poniżej tag tag który był początek,

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

i miał tag poniżej,

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

jako znacznika początku mojej web.xml i rozwiązać mój problem.

Uwaga: upewnij się, że nie ma żadnych komentarzy, tagów, wolnych miejsc lub niechcianych znaków pozostawionych przed tagiem <?xml ...?>. Będzie to głównie powodować ten typ błędu podczas analizowania plików xml.

Powiązane problemy