web-dev-qa-db-fra.com

"[Erreur fatale]: 1: 120: La cible d'instruction de traitement correspondant à" [xX] [mM] [lL] "n'est pas autorisée."

En voici une difficile pour vous. 

Je travaille sur un projet de classe où je crée un programme de chat peer-to-peer et j'ai ce problème:

Lorsque j'ouvre une fenêtre de discussion, aucun problème. Lorsque j'ouvre une seconde fenêtre et que je tente de me connecter au chat, j'obtiens cette erreur:

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

Je suis presque sûr que cela a quelque chose à voir avec la façon dont mon code crée le XML pour les participants. 

Voici tout le code que j'ai écrit:

    /*
 * 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;
    }
}
24
novicePrgrmr

Je l'ai compris. Je devais vider le tampon après chaque nouveau participant créé. duh !!!

merci pour l'aide!!

2
novicePrgrmr

Le problème est que vous avez plus d'un en-tête XML ou d'un bruit avant un.

Le début typique d'un document XML ...

<?xml version='1.0'?>

ressemble à un PI, mais ne l'est pas. Si vous avez un extra, ou si vous avez autre chose qu'une nomenclature, c'est l'erreur que vous obtiendrez.

43
bmargulies

J'ai rencontré le même problème lors du déploiement d'une webapp printanière sur weblogic. Nous avions la première ligne sous forme de fichier xml viergein. Cela a provoqué un échec d'analyse XML avec cette erreur. Après avoir enlevé ça, ça a marché !! J'espère que c'est aussi une information utile pour les autres .. :) 

15
Gopinath M.R

Il y a du contenu indésirable peut être l'espace d'autre chose bruyante avant le début de vous xml à savoir:

<?xml version='1.0'?>

Assurez-vous qu'il n'y a rien avant le démarrage de votre XML. Cela résoudra le problème, Un exemple connexe est:

référence connexe

11
Forhad

J'ai rencontré le même problème et j'ai résolu comme suit.

Le code suivant cause une erreur.

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

Alors, je mets simplement un espace avant?>.

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

Après que j'ai fait comme ça, il n'y avait plus d'erreur.

6
Zin Win Htet

Une autre réponse à cette question est d'utiliser XML dans XML, vous aurez besoin de ne pas analyser le XML interne et d'utiliser la balise CDATA, voir ici:

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

c'est à dire:

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

Je travaillais récemment sur un exemple de projet de démarrage Spring MVC dans lequel j'ai utilisé l'outil construit maven. Lorsque j'exécute mon serveur à l'aide de jetty, cette erreur d'instruction de traitement s'est produite et j'ai constaté que mon web.xml avait une balise supplémentaire avant la balise <xml> et qu'il commençait par la balise <DOCTYPE>

Alors j'ai enlevé la balise ci-dessous qui était la balise de départ,

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

et avait l'étiquette ci-dessous,

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

comme balise de départ de mon web.xml et cela a résolu mon problème.

Remarque: assurez-vous qu'il ne reste aucun commentaire, tag, espace libre ou caractère indésirable avant la balise <?xml ...?>. Cela lève principalement ce type d'erreur lors de l'analyse des fichiers XML.

2
Lucky

En fait, c’est à cause de contenus indésirables; dans mon cas, c’est parce que j’utilise toujours des commentaires pour comprendre le code plus tard. J'ai donc eu des commentaires avec <!-- --> avant le <?xml version='1.0'?>

Il suffit donc de mettre les commentaires après cette ligne et le problème résolu!

0
AngieF