Создание XML-файла

Модератор: Absurd

Gugle
Сообщения: 22
Зарегистрирован: 17 май 2006, 18:18
Откуда: Москва
Контактная информация:

Доброго времени суток!

Создаю документ определенной структуры и запихиваю его в файл. Используется модель DOM.

Код:

Код: Выделить всё

try  {
   Document doc = null;
   DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
   doc = builder.newDocument();       

   Element elem = doc.createElement("main");
   elem.setAttributeNode(doc.createAttribute("name"));
   elem.setAttribute("title","hello");
   doc.appendChild(elem);

             ....
            
   try { 
      Result result = new StreamResult(file);          
      Source source = new DOMSource(doc);            
      Transformer xformer = TransformerFactory.newInstance().newTransformer();
      xformer.setOutputProperty(OutputKeys.INDENT,"yes");
      xformer.transform(source, result);
   }         
     catch (TransformerConfigurationException e) {  }
     catch (TransformerException e) {  }
   }
   catch (Exception e) {  }
Теперь хочу достучаться до этого документа, а мне программа отвечает что он занят. Как отпустить этот файл?
mobius
Сообщения: 157
Зарегистрирован: 25 янв 2005, 18:42
Откуда: Минск
Контактная информация:

result не забыл закрыть?
Всё об отдыхе на http://chugaga.com
Gugle
Сообщения: 22
Зарегистрирован: 17 май 2006, 18:18
Откуда: Москва
Контактная информация:

Вопрос в том "КАК?!?".
Метода "result.close();" нет.
mobius
Сообщения: 157
Зарегистрирован: 25 янв 2005, 18:42
Откуда: Минск
Контактная информация:

А ты его так и не закроешь, из StreamResult тянется только у тебя фактически имя файла, больше ничего, тебя даже смысле нету делать new StreamResult(file).
Сам файл создаётся где-то внутри DTMManager, если не ошибаюсь, туда ты точно не достучишься.
С такой продлемой я, если чесно не сталкивался, а так попробуй ява-доки почитать, мот поможет.
Посмотри, не валится ли у тебя exception где? Мот ты его прячешь. Получается ошибка есть, но ты её не видишь.
И ты уверен, что файл реально создаётся?

Работаешь ли ты с потоками? Если да, то возможно где-то пытаешься из двух мест к своему объекту достучатся (transform в нутрях засинхронизирован). Если не используешь, то этот вариант отпадает
Всё об отдыхе на http://chugaga.com
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

я не в курсе, о чём вы тут говорите, так что если я не в тему - заранее извиняюсь, что влажу,
но если хочется что-то закрыть, то можно попробовать

[syntax:25f712dce3="java"]result.getOutputStream().close()[/syntax:25f712dce3]

ну и ясно, что написание пустых catch блоков ни к чему хорошему привести не может
mobius
Сообщения: 157
Зарегистрирован: 25 янв 2005, 18:42
Откуда: Минск
Контактная информация:

To Oscar: это если outputStream создаётся конструктором StreamResult(file), но увы, там только инициализируется имя файла, если посмотреть исходный код.
Всё об отдыхе на http://chugaga.com
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

mobius, кода перед глазами нету, но если OutputStream не создаётся, то почему у меня в результате нижеуказанного кода появляется xml файл на диске?

Пришлось открыть Eclipse и ввести предложенный код.
Слегка подправив try-catch и добавив вывод у меня получилось следующее :

[syntax:c9e2c70c12="java"]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");
}

}[/syntax:c9e2c70c12]

Gugle, такой код у тебя работает?
Каким образом ты пытаешься "достучаться" до документа, и кто и какими словами тебе отвечается, что ресурс занят?
Gugle
Сообщения: 22
Зарегистрирован: 17 май 2006, 18:18
Откуда: Москва
Контактная информация:

Работатет. Я пробовал созданый файл читать простым методом FileInputStream(). Файл доступен. После создания файла я его пытаюсь от править на сервер, а система выдает "File not found." Причем если вырубить прогу которая его создавала то все отправляется без проблем. Подрубаю Explorer к файлу - работает, врубаю прогу которая файл создает (это только один класс описаный выше), ничерта не работет... То же Explorer пишет "File not found."
Gugle
Сообщения: 22
Зарегистрирован: 17 май 2006, 18:18
Откуда: Москва
Контактная информация:

Соединение делаю так:

Код: Выделить всё

        int i;
        String otvet = "";
        
        try {
            Socket sock = new Socket("127.0.0.1", 80);
            System.out.println("Соединение с сервером - " + sock.getInetAddress() + "\n");
            InputStream in = sock.getInputStream();
            OutputStream out = sock.getOutputStream();
            String str = "GET /Test.htm HTTP";
            byte buf[] = str.getBytes();
            out.write(buf);
            while ((i = in.read()) != -1) {
                otvet = otvet + String.valueOf((char)i);
            }
            System.out.println(otvet);
            sock.close();
        } catch (java.io.IOException e) {
            System.out.println("Ошибка соединения с localhost: " + e + "\n");
        }
Все это вставил прям после "System.out.println("read end");" в примере выше. Не работает. Причем сервер отвечает что вместес запросом "String str = "GET /Test.htm HTTP";" Приходят непонятные символы "^!!" в конце строки. Я думаю что это из-за них система отвечает "File not found.", но откуда они появляются не понимаю. Причем почему их и Explorer откуда то берет для меня то же загадка.
Gugle
Сообщения: 22
Зарегистрирован: 17 май 2006, 18:18
Откуда: Москва
Контактная информация:

Он не просто их подставляет в конец строки, а заменяет последние 3 символа на этот бред. Причем вариант отправки типа:

Код: Выделить всё

len = str.length();
byte buf[] = str.getBytes();
out.write(buf, 0, len);
То же не прокатывает. В конце строки запроса вместо нужных символов валит бред "^!!".
Ответить