Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XML - изменение значения 
V
    Опции темы
Entry_N3
  Дата 20.3.2007, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 8.2.2007

Репутация: нет
Всего: нет



есть xml-файл. задано название атрибута, значение которого необходимо изменить. т.е надо открыть xml, записать значение по заданному узлу, сохранить изменения в данном xml 

как это реализовать программно на java? особенно запись значения по заданному узлу?  smile 
PM MAIL   Вверх
nornad
Дата 21.3.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Если точно известен путь к узлу, то создай DOM и используй XPath. Если путь варьируется (и при этом есть другие узлы с таким именем, но их менять не надо) или же XML большой, то используй SAX-парсер.

Добавлено @ 00:10 
Если через DOM, то запись довольно просто реализуется через методы у Element или Node.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Entry_N3
Дата 21.3.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 8.2.2007

Репутация: нет
Всего: нет



есть один узел, значение по которому необходимо проставить (или изменить). использовать надо DOM. 

можно пример?
PM MAIL   Вверх
LSD
Дата 21.3.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Можно распарсить документ SAX-ом, а затем сформировать новый.
В принципе там все будет элементарно, все что поступает на вход DefaultHandler, передается как есть на вход SAXTransformerFactory, за исключением того самого аттрибута который надо изменить.

Это сообщение отредактировал(а) LSD - 21.3.2007, 14:09


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Entry_N3
Дата 21.3.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 8.2.2007

Репутация: нет
Всего: нет



нужно через DOM

Добавлено @ 12:43 
LSD, 2 ссылки на одну постоянную страницу
PM MAIL   Вверх
LSD
Дата 21.3.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Entry_N3 @  21.3.2007,  12:42 Найти цитируемый пост)
LSD, 2 ссылки на одну постоянную страницу

Исправил.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Entry_N3
Дата 23.3.2007, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 8.2.2007

Репутация: нет
Всего: нет



постоил DOM модель, и воспользовался методами getElementsByTagName и setNodeValue
PM MAIL   Вверх
NiТR0
Дата 30.1.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 28.6.2005

Репутация: нет
Всего: нет



Так изменятся только значения узлов... А как быть с атрибутами???
PM MAIL   Вверх
LSD
Дата 30.1.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(NiТR0 @  30.1.2008,  17:14 Найти цитируемый пост)
Так изменятся только значения узлов... А как быть с атрибутами???

Это ты вообще о чем?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
NiТR0
  Дата 30.1.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 28.6.2005

Репутация: нет
Всего: нет



Хотелось узнать , как можно изменить атрибут, а не значение узла (если пользоваться DOM)

Я создаю xml следующей структуры:
<log>
<messageType attr="Attr 1">Test</messageType>
</log>

Код

DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = docBuilder.newDocument();
Element log_MainTag = document.createElement("log");
Element messageType = document.createElement("messageType");  
         
messageType.appendChild(document.createTextNode("Test"));
messageType.setAttribute("attr", "Attr 1");

log_MainTag.appendChild(messageType);


... далее мне надо изменить значение атрибута "attr", например на "Attr 2", но никак не получается.
PM MAIL   Вверх
nornad
Дата 30.1.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(NiТR0 @  30.1.2008,  21:15 Найти цитируемый пост)
... далее мне надо изменить значение атрибута "attr", например на "Attr 2", но никак не получается. 

Ну, вроде бы должно помочь такое:
Код

messageType.setAttribute("attr", "Attr 2");

Писать там, где ты и хочешь изменить. Повторная установка значения перекрывает старое значение.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
3Maestro3
Дата 10.2.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



Народ, ХЕЛП! Никак не получается изменить значение тэга в XML-файле. Через методы Element или Node пробовал, а именно:

  if (childElement.getTagName().equals("size"))  // где size это тот тэг, значение которого надо изменить
                  {
                                                        
                    String s = this.jTextField3.getText();
          
                     childElement.setAttribute("name",s);
                     System.out.println(childElement);                     
                 
                    String size = this.jTextField3.getText();
                     textNode.setTextContent(size);

Не помогло. Причем ошибки невыдаёт ни-ка-кой. может неправильно XML закрывается?..
  System.out.println(childElement);   кстати выдаёт [ size: null]

а при запуске появляется сообщение:
 java.lang.IllegalArgumentException: defaultCloseOperation must be one of: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, or DISPOSE_ON_CLOSE

господа, что делать, как говорил Чернышевский?
PM MAIL   Вверх
nornad
Дата 10.2.2008, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(3Maestro3 @  10.2.2008,  17:29 Найти цитируемый пост)
господа, что делать, как говорил Чернышевский? 

В вашем случае изучать основы Java GUI. Сообщение указывает вам на то, что вы установили неверный тип операции при закрытии основного окна. И даже даёт вам подсказку, что именно должно быть установлено.
Теперь по хмлу. Либо приведите полноценный пример, чтобы его можно было запустить и посмотреть, где и что у вас не так, либо объясните нормально и доходчиво - что именно делаете, на какой хмл натравливаете свой код, где именно и какая проблема.

Цитата(3Maestro3 @  10.2.2008,  17:29 Найти цитируемый пост)
может неправильно XML закрывается?..

Если вы работаете через DOM, то он сам следит за корректным открытием-закрытием тегов. Точнее, вы работаете не напрямую с хмл, а с деревом элементов. Закрытие и открытие тегов будет корректно произведено при преобразовании дерева в текст хмла.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
3Maestro3
Дата 11.2.2008, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



Уважаемый, зачем так грубо? Мне нужно изменить значения, хранимые в XML. По-моему это вполне доходчиво. Делаться это должно по событию нажатия кнопки (JButtonClicked). Ввод данных производиться с клавиатуры через текстовоге окно(jTextField).
XML содержит:
Код

<application>
<table id="1" properties="properties" /> 
</application>

код: 
Код

private DocumentBuilder builder;

  public void JButtonClicked()
{
 try
        {
        Document doc = builder.parse(File);
        Element root = doc.getDocumentElement();
        NodeList children = root.getChildNodes();
        for (int i=0; i<children.getLength(); i++)
        {
            Node child = children.item(i);
            if (child instanceof Element)
            {
                Element childElement = (Element) child;
                Text textNode = (Text) childElement.getFirstChild();
                String text = textNode.getData().trim();

                {
                     if (childElement.getTagName().equals("table"))
                    {   
                         
                         String s = this.jTextField.getText();
                         childElement.setAttribute("properties",s);
                      }
                  }
                 }
               }
                }

                       catch(Exception e)
{
System.out.println(e.ToString());
}
}

Как вы поняли надо изменить содержимое properties.
Видимо, что бы данные преобразовались в текст XML, следует создать входящий и исходящий потоки. Подскажите как это сделать в конкретном моём случае!!
PM MAIL   Вверх
nornad
Дата 12.2.2008, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



3Maestro3, для кода есть специальные теги и даже кнопочка в редакторе для упрощения (чтобы теги руками не вводить).
Грубить вам я не имел намерения. Я лишь указывал на достаточно очевидный ответ.
Цитата

Как вы поняли надо изменить содержимое properties.

По вашим прошлым объяснениям я понял, что вы хотели изменить значение не атрибута, а самого узла.

Вот ответ на оба вопроса (как изменить значение атрибута и как перевести хмл-дерево в строку):
Код

import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

/**
 * Author: .nornad
 * 12.02.2008 4:48:09
 */
public class XmlTest
{
    public static void main( String[] args )
            throws ParserConfigurationException, IOException, SAXException, TransformerException
    {
        StringReader reader = new StringReader("<?xml version=\"1.0\"?>\n"
                + "<application>\n"
                + "<table id=\"1\" properties=\"properties\" /> \n"
                + "</application>");
        InputSource source = new InputSource(reader);
        Element doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
                .parse(source).getDocumentElement();

        NodeList children = doc.getChildNodes();
        for ( int i = 0; i < children.getLength(); i++ ) {
            Node child = children.item(i);
            if ( child instanceof Element ) {
                Element childElement = (Element) child;
                Attr attr = childElement.getAttributeNode("properties");
                attr.setValue("new property value");
            }
        }
        StringWriter writer = new StringWriter();
        TransformerFactory.newInstance().newTransformer().transform(
                new DOMSource(doc),
                new StreamResult(writer)
        );
        System.out.println(writer.toString());
    }
}



--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1138 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.