2010-11-21 40 views
24

Đây là một trong những khó khăn cho bạn."[Lỗi nghiêm trọng]: 1: 120: Không cho phép mục tiêu lệnh xử lý khớp" [xX] [mM] [lL] ".

tôi đang làm việc trên một dự án lớp học, nơi tôi có thể tạo một chương trình chat peer-to-peer và tôi có vấn đề này:

Khi tôi mở ra một cửa sổ chat, không có vấn đề. Khi tôi mở cửa sổ thứ hai và thử đăng nhập vào cuộc trò chuyện, tôi gặp phải lỗi này:

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

Tôi khá chắc chắn rằng nó có liên quan đến cách mã của tôi đang tạo XML cho người tham gia.

Dưới đây là tất cả các mã tôi đã viết:

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

Lỗi xảy ra trong gói chatter2 bạn đã bao gồm; chúng tôi không biết điều gì đang làm, việc xem mã của bạn không liên quan. – BeemerGuy

+0

Chatter2 là tên dự án. – novicePrgrmr

+1

Độ phân giải của mỗi * ba * nguyên nhân có thể có của thông báo lỗi này được đề cập [** here **] (http://stackoverflow.com/a/19898942/290085). – kjhughes

Trả lời

2

Tôi đã tìm ra. Tôi cần xóa bộ đệm sau khi mọi người tham gia mới được tạo. duh !!!

cảm ơn sự trợ giúp !!

41

Vấn đề là bạn có nhiều hơn một tiêu đề XML hoặc tiếng ồn từ trước khi.

Sự bắt đầu điển hình của một doc XML ...

<?xml version='1.0'?> 

trông giống như một PI, nhưng không phải vậy. Nếu bạn có thêm, hoặc nếu bạn có bất cứ điều gì khác hơn một BOM trước một, đó là lỗi bạn sẽ nhận được.

+2

PI là một lệnh xử lý như trong thông báo lỗi của bạn. –

+0

Tôi chỉ phát hiện ra rằng nếu tôi bắt đầu tất cả các cửa sổ trò chuyện trước khi đăng nhập vào chatters trong, sau đó tôi không nhận được lỗi đó. Bất kỳ đầu mối tại sao? – novicePrgrmr

+0

Eric, bạn cần phải ngừng yêu cầu chúng tôi gỡ lỗi chương trình của bạn từ đầu và bắt đầu hiểu hành vi của nó từ phía dưới. – bmargulies

3

Một câu trả lời cho điều này được sử dụng XML trong XML sẽ phá vỡ bạn cần không phân tích cú pháp XML bên trong và sử dụng thẻ CDATA thấy ở đây:

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

ví dụ:

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

tôi phải đối mặt với vấn đề tương tự về việc triển khai một webapp mùa xuân trên weblogic. Chúng tôi có dòng đầu tiên là trống trong tệp xml. Điều này gây ra lỗi phân tích cú pháp XML với lỗi này. Sau khi loại bỏ điều này, nó đã làm việc !! Hy vọng nó sẽ là thông tin hữu ích cho người khác quá .. :)

11

Có nội dung không mong muốn có thể không gian điều ồn ào khác trước khi bắt đầu của bạn xml cụ thể là:

<?xml version='1.0'?> 

Hãy chắc chắn rằng không có gì là trước khi bắt đầu của xml của bạn. Điều này sẽ giải quyết vấn đề, Một ví dụ liên quan là:

related reference

6

tôi gặp phải cùng một vấn đề và tôi giải quyết như sau.

Lỗi sau mã gây ra.

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

Vì vậy, tôi chỉ cần đặt khoảng trắng trước?>.

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

Sau khi tôi làm như vậy, không còn lỗi nữa.

0

Nó thực sự là vì nội dung không mong muốn, trong trường hợp của tôi đó là vì tôi luôn luôn sử dụng ý kiến ​​để hiểu mã sau vì vậy tôi đã bình luận với <!-- --> trước <?xml version='1.0'?>

Vì vậy, chỉ cần đặt comments sau dòng này và giải quyết vấn đề!

2

Gần đây tôi đã làm việc trên mẫu dự án khởi động Spring MVC, nơi tôi đã sử dụng công cụ được xây dựng maven. Khi tôi chạy máy chủ của tôi bằng cách sử dụng cầu cảng tôi nhận được lỗi hướng dẫn xử lý này và tôi thấy rằng web.xml của tôi đã có thêm thẻ trước thẻ <xml> và thẻ bắt đầu bằng thẻ <DOCTYPE> thay thế.

Vì vậy, tôi loại bỏ các thẻ bên dưới đó là thẻ bắt đầu,

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

và có thẻ dưới đây,

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

như thẻ bắt đầu web.xml của tôi và nó giải quyết vấn đề của tôi.

Lưu ý: Hãy đảm bảo không có nhận xét, thẻ, không gian trống hoặc bất kỳ ký tự không mong muốn nào còn lại trước thẻ <?xml ...?>. Điều này chủ yếu sẽ ném các loại lỗi trong khi phân tích các tập tin xml.

Các vấn đề liên quan