Hello!
I have also tried to do it like this:
public synchronized void sendMessage()
{
if(message != null)
{
try
{
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
XmlWriter xmlWriter = new XmlWriter( new OutputStreamWriter( byteArrayOutputStream ) );
writeXML(xmlWriter);
xmlWriter.flush();
String xmlString = new String( byteArrayOutputStream.toByteArray() );
xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE message PUBLIC \"foo\" \"
http://atlas.dsv.su.se/~pierre/i/05_ass/ip4/a_1_3_3/message.dtd\">\n" + xmlString;
System.out.println(xmlString);
outputStream.write(xmlString.getBytes());
outputStream.write("\r\n".getBytes());
}
catch (Exception ex)
{
ex.printStackTrace();
}
message = null;
}
}
private void writeXML(AbstractXmlWriter writer) throws IOException
{
writer.startTag("message");
writer.startTag("header");
writer.startTag("protocol");
writer.startTag("type");
writer.write("CTTP");
writer.endTag();
writer.startTag("version");
writer.write("1.0");
writer.endTag();
writer.startTag("command");
writer.write("MESS");
writer.endTag();
writer.endTag();
writer.startTag("id");
writer.startTag("name");
writer.write(name);
writer.endTag();
writer.startTag("email");
writer.write(email);
writer.endTag();
writer.startTag("homepage");
writer.write(homepage);
writer.endTag();
writer.startTag("host");
writer.write("Administrator");
writer.endTag();
writer.endTag();
writer.endTag();
System.out.println("MUPP");
writer.startTag("body");
writer.write(message);
writer.endTag();
writer.endTag();
}
But then I get errors saying that the document is not wellformed when i recive the message.
The dtd looks like:
<!ELEMENT message (header, body)>
<!ELEMENT header (protocol, id)>
<!ELEMENT protocol (type, version, command)>
<!ELEMENT type (#PCDATA)>
<!ELEMENT version (#PCDATA)>
<!ELEMENT command (#PCDATA)>
<!ELEMENT id (name, email, homepage, host)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT homepage (#PCDATA)>
<!ELEMENT host (#PCDATA)>
<!ELEMENT body (#PCDATA)>
My send xml looks like, and I do think it match the dtd:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE message PUBLIC "foo" "
http://atlas.dsv.su.se/~pierre/i/05_ass/ip4/a_1_3_3/message.dtd"><message>
<header>
<protocol>
<type>CTTP</type>
<version>1.0</version>
<command>MESS</command>
</protocol>
<id>
<name>Fredrik Andersson</name>
<email>fr-ander@dsv.su.se</email>
<homepage>
http://www.nu</homepage> <host>Administrator</host>
</id>
</header>
<body>Hello!</body>
</message>
The error looks like below, first I get a couple of:
Fatalerror:
Premature end of file.
org.jdom.input.JDOMParseException: Error on line -1: Premature end of file.
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:468)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:851)
at MyXMLChatClient.receive(MyXMLChatClient.java:149)
at ChatClient.run(ChatClient.java:28)
Caused by: org.xml.sax.SAXParseException: Premature end of file.
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1269)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:453)
... 3 more
Caused by: org.xml.sax.SAXParseException: Premature end of file.
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1269)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:453)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:851)
at MyXMLChatClient.receive(MyXMLChatClient.java:149)
at ChatClient.run(ChatClient.java:28)
Caused by: org.xml.sax.SAXParseException: Premature end of file.
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1269)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:453)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:851)
at MyXMLChatClient.receive(MyXMLChatClient.java:149)
at ChatClient.run(ChatClient.java:28)
After that I get a hole bunch of these errors for every element I guess:
Error:
Document is invalid: no grammar found.
Error:
Document root element "message", must match DOCTYPE root "null".
Fatalerror:
XML document structures must start and end within the same entity.
org.jdom.input.JDOMParseException: Error on line 1: XML document structures must
start and end within the same entity.
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:468)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:851)
at MyXMLChatClient.receive(MyXMLChatClient.java:149)
at ChatClient.run(ChatClient.java:28)
Caused by: org.xml.sax.SAXParseException: XML document structures must start and end within the same entity.
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1269)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:453)
... 3 more
Caused by: org.xml.sax.SAXParseException: XML document structures must start and end within the same entity.
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1269)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:453)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:851)
at MyXMLChatClient.receive(MyXMLChatClient.java:149)
at ChatClient.run(ChatClient.java:28)
Caused by: org.xml.sax.SAXParseException: XML document structures must start and end within the same entity.
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1269)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:453)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:851)
at MyXMLChatClient.receive(MyXMLChatClient.java:149)
at ChatClient.run(ChatClient.java:28)
My receive method in the other chat client looks like:
public void receive(String message)
{
try
{
StringReader stringReader = new StringReader(message);
SAXBuilder saxBuilder = new SAXBuilder(true);
saxBuilder.setErrorHandler(this);
Document document = saxBuilder.build(stringReader);
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(getXmlValue(document, "message/header/id/name"));
stringBuffer.append(" (");
stringBuffer.append(getXmlValue(document, "message/header/id/email"));
stringBuffer.append("): ");
stringBuffer.append(getXmlValue(document, "message/body"));
jEditorPane.setText(jEditorPane.getText() + stringBuffer.toString() + "\n");
System.out.println("\nInput:");
writeOutDocument(document);
}
catch(Exception e)
{
e.printStackTrace();
}
}
...and...
public String getXmlValue(Document document, String tagPath) throws JDOMException
{
Element element = (Element) XPath.selectSingleNode(document, tagPath);
return element.getText();
}
It uses:
import org.jdom.*;
import org.jdom.input.*;
import org.xml.sax.helpers.*;
import org.xml.sax.*;
import org.jdom.output.*;
import org.jdom.xpath.*;
So if ypou guys got any ideas please let me know!
Best regards
Fredrik