2014-02-26 115 views
0

我一直在寻找解决这个问题的办法,但是什么都没发现。我正在通过Java TCP/IP套接字创建一个简单的聊天对话框,并且我遇到了创建包含字母“åäö”的XML字符串的问题。解析Java StAX XML问题

可以说,我通过一个XMLObject与领域

名=“服务器”,颜色=“#FF0000”文本=“AAO”

由分析器返回的产生的xmlString将

<?xml version="1.0"?><message sender="Server"><text color="#FF0000”>???</text></message> 

åäö变成???。任何想法?谢谢!

**更新** 好的,所以我刚刚意识到从JTextArea获取文本时出现问题。

如果我运行此代码:

package self.edu.javaprojekt.view; 

import self.edu.javaprojekt.model.XMLObject; 
import self.edu.javaprojekt.model.XMLParser; 

public class Test { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     XMLObject object = new XMLObject(); 
     object.setColor("#FF0000"); 
     object.setSender("Server"); 
     object.setText("åäö"); 
     String parsed = XMLParser.parse(object); 
     System.out.println(parsed); 
     System.out.println(XMLParser.parse(parsed)); 

    } 

} 

我得到正确的结果:

<?xml version="1.0" encoding="UTF-8"?><message sender="Server"><text color="#FF0000">åäö</text></message> 
XMLObject [sender=Server, text=åäö, color=#FF0000] 

但随着文本区域。以下方法返回的文本被添加到一个XMLObject中,然后被发送用于解析。

public String readAndClearMessageArea() { 
     String text = messageTextArea.getText(); 
     appendToPane("\n" + controller.getName() + ": " + text, controller.getColor()); 
     messageTextArea.setText(""); 
     return text; 
    } 

我得到了奇怪的结果。任何新想法?谢谢!!

这是解析器

package self.edu.javaprojekt.model; 

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.UnsupportedEncodingException; 
import java.nio.ByteBuffer; 
import java.nio.charset.Charset; 
import java.util.Iterator; 

import javax.xml.stream.XMLEventFactory; 
import javax.xml.stream.XMLEventReader; 
import javax.xml.stream.XMLEventWriter; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLOutputFactory; 
import javax.xml.stream.XMLStreamException; 
import javax.xml.stream.events.Attribute; 
import javax.xml.stream.events.Characters; 
import javax.xml.stream.events.EndElement; 
import javax.xml.stream.events.StartDocument; 
import javax.xml.stream.events.StartElement; 
import javax.xml.stream.events.XMLEvent; 

public class XMLParser { 
    public static final String MESSAGE_TAG = "message"; 
    public static final String SENDER_TAG = "sender"; 
    public static final String TEXT_TAG = "text"; 
    public static final String COLOR_TAG = "color"; 
    public static final String DISCONNECT_TAG = "disconnect"; 
    public static final String ENCRYPTED_TAG = "encrypted"; 
    public static final String ENCRYPTED_TYPE_TAG = "type"; 
    public static final String KEY_REQUEST_TAG = "keyrequest"; 

    public static String parse(XMLObject object) { 
     // create an XMLOutputFactory 
     XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); 
     // create XMLEventWriter 
     XMLEventWriter eventWriter; 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     String xmlString = ""; 
     try { 
      eventWriter = outputFactory.createXMLEventWriter(out); 

      // create an EventFactory 
      XMLEventFactory eventFactory = XMLEventFactory.newInstance(); 
      //XMLEvent end = eventFactory.createDTD("\n"); 
      //XMLEvent tab = eventFactory.createDTD("\t"); 
      // create and write Start Tag 
      StartDocument startDocument = eventFactory.createStartDocument("UTF-8"); 
      eventWriter.add(startDocument); 

      // create message open tag 
      //eventWriter.add(end); 
      StartElement messageStartElement = eventFactory.createStartElement(
        "", "", MESSAGE_TAG); 
      eventWriter.add(messageStartElement); 
      eventWriter.add(eventFactory.createAttribute(SENDER_TAG, 
        object.getSender())); 
      //eventWriter.add(end); 

      // create the text 
      //eventWriter.add(tab); 
      StartElement textStartElement = eventFactory.createStartElement("", 
        "", TEXT_TAG); 
      eventWriter.add(textStartElement); 
      eventWriter.add(eventFactory.createAttribute(COLOR_TAG, 
        object.getColor())); 

      Characters characters = eventFactory.createCharacters(object.getText()); 
      eventWriter.add(characters); 

      //eventWriter.add(tab); 
      eventWriter.add(eventFactory.createEndElement("", "", TEXT_TAG)); 
      //eventWriter.add(end); 

      eventWriter.add(eventFactory.createEndElement("", "", MESSAGE_TAG)); 
      //eventWriter.add(end); 
      eventWriter.add(eventFactory.createEndDocument()); 
      eventWriter.close(); 
      xmlString = out.toString("UTF-8"); 
     } catch (XMLStreamException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return xmlString; 
    } 

    @SuppressWarnings("unchecked") 
    public static XMLObject parse(String string) { 
     XMLObject object = null; 
     try { 
      // First, create a new XMLInputFactory 
      XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
      // Setup a new eventReader 
      InputStream in; 
      if (!string.equals("")) { 
       in = new ByteArrayInputStream(Charset.forName("UTF-8") 
         .encode(string).array()); 
      } else { 
       in = new FileInputStream("xmltest.txt"); 
      } 
      XMLEventReader eventReader = inputFactory.createXMLEventReader(in); 

      // read the XML document 
      while (eventReader.hasNext()) { 
       XMLEvent event = eventReader.nextEvent(); 
       if (event.isStartElement()) { 
        StartElement startElement = event.asStartElement(); 
        // If we have a message 
        if (startElement.getName().getLocalPart() 
          .equals(MESSAGE_TAG)) { 
         object = new XMLObject(); 
         // We read the attributes from this tag and add the 
         // sender 
         // attribute to our object 
         Iterator<Attribute> attributes = startElement 
           .getAttributes(); 
         while (attributes.hasNext()) { 
          Attribute attribute = attributes.next(); 
          if (attribute.getName().getLocalPart() 
            .equals(SENDER_TAG)) { 
           object.setSender(attribute.getValue()); 
          } 

         } 
        } 

        if (startElement.getName().getLocalPart().equals(TEXT_TAG)) { 
         // We read the attributes from this tag and add the 
         // color 
         // attribute to our object 
         Iterator<Attribute> attributes = startElement 
           .getAttributes(); 
         while (attributes.hasNext()) { 
          Attribute attribute = attributes.next(); 
          if (attribute.getName().getLocalPart() 
            .equals(COLOR_TAG)) { 
           object.setColor(attribute.getValue()); 
          } 

         } 
         // And then get the text 
         event = eventReader.nextEvent(); 
         object.setText(event.asCharacters().getData()); 
         continue; 
        } 
       } 
       // If we reach the end of the message, return the object 
       if (event.isEndElement()) { 
        EndElement endElement = event.asEndElement(); 
        if (endElement.getName().getLocalPart().equals(MESSAGE_TAG)) { 
         return object; 
        } 
       } 

      } 
     } catch (XMLStreamException | FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

这是类控股的XML值

package self.edu.javaprojekt.model; 

public class XMLObject { 
    private String sender, text, color; 

    public String getSender() { 
     return sender; 
    } 

    public String getText() { 
     return text; 
    } 

    public String getColor() { 
     return color; 
    } 

    public void setSender(String sender) { 
     this.sender = sender; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

    public void setColor(String color) { 
     this.color = color; 
    } 

    @Override 
    public String toString() { 
     return "XMLObject [sender=" + sender + ", text=" + text + ", color=" 
       + color + "]"; 
    } 

} 
+0

看起来像一些编码问题。 – Leo

回答

0

我以前见过这种情况,可以使用不同的编码,看看哪一个对你的工作。但试试ISO-8859-1或UTF-16。不确定你需要哪种编码。

+0

感谢您的回复。我发现这个问题源于JTextArea.getText()。查看更新的问题! – Joakim