Меня терзает смутное чувство, что "кто-то ест слишком много мёда" (с)
Я-то думал, что нужно XML файл создать, а тут откуда ни возьмись появились сокеты, какие-то Explorer_ы и, как я догадался, всё это ещё и на сервере бежать должно ....
Больше всего мне нравится то, что понятие "отправить" ассоциируется с методом "GET" :-)
Значится так, я не знаю, как оно делается через сокеты и искать мне лень, но есть подозрение, что вышеописанное обращение через сокет - не правильное (у меня это чудо просто "висит" в ожидании in.read()).
Я написал следующий код, положил его в корень сервера (Linux SuSe 9.2 ++ java 1.5) и всё сработало "на ура".
[syntax:6f88f648f6="java"]import java.io.*;
import java.net.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.w3c.dom.*;
public class XMLTest {
public static void main(String[] args) {
DocumentBuilder builder;
try {
builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
return;
}
Document doc = builder.newDocument();
Element elem = doc.createElement("main");
elem.setAttributeNode(doc.createAttribute("name"));
elem.setAttribute("title", "hello");
doc.appendChild(elem);
Result result = new StreamResult("test.xml");
Source source = new DOMSource(doc);
Transformer xformer;
try {
xformer = TransformerFactory.newInstance().newTransformer();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
return;
} catch (TransformerFactoryConfigurationError e) {
e.printStackTrace();
return;
}
xformer.setOutputProperty(OutputKeys.INDENT, "yes");
try {
xformer.transform(source, result);
} catch (TransformerException e) {
e.printStackTrace();
return;
}
System.out.println("create end");
NodeList list = doc.getChildNodes();
for(int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
System.out.println("Node: " + node.getNodeName());
NamedNodeMap map = node.getAttributes();
for(int j = 0; j < map.getLength(); j++) {
Node attribute = map.item(j);
System.out.println("\tattribute " + j + " : " + attribute.getNodeName() + " = " + attribute.getNodeValue());
}
}
System.out.println("read end");
File dir = new File("./");
String[] files = dir.list();
for(int i = 0; i < files.length; i++) {
System.out.println("0" + files
+ "0");
}
int i;
String otvet = "";
GetXML get = null;
InputStream in = null;
try {
get = new GetXML(new URL("http://www-old.pe.mw.tu-muenchen.de/test.xml"), "www-old.pe.mw.tu-muenchen.de", 80);
in = get.getInputStream();
while ((i = in.read()) != -1) {
otvet += String.valueOf((char)i);
}
System.out.println(otvet);
} catch (java.io.IOException e) {
System.out.println("Cannot connect to localhost: " + e.getMessage() + "\n");
} finally {
try {
if (in != null)
in.close();
if (get != null)
get.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
static class GetXML extends sun.net.http://www.protocol.http.HttpURLConnection {
public GetXML(URL arg0, String arg1, int arg2) {
super(arg0, arg1, arg2);
}
}
}[/syntax:6f88f648f6]
После "read end" я добавил вывод всех файлов в текущей директории
и одна из строчек у меня выглядит, как "0test.xml0", и никаких восклицательных знаков.
(нули я добавил, чтобы проверить, не будет ли пробелов вокруг, на всякий случай).
Так вот, Gugle, если у тебя этот код заработает - начинай разбираться, как правильно обращаться с HTTP коннекшнами.
Я думаю, что с самим построением XML-файла это не связано.
P.S. при обращении я использовал полное имя сервера, поскольку по localhost мне выдавалось "Connection refused" (наверное сервер под локалхост не настроен).