Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > XML - изменение значения


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

как это реализовать программно на java? особенно запись значения по заданному узлу?  smile 

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

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

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

можно пример?

Автор: LSD 21.3.2007, 12:14
Можно http://vingrad.ru/JAVA-JAV-003029, а затем http://vingrad.ru/JAVA-JAV-003059.
В принципе там все будет элементарно, все что поступает на вход DefaultHandler, передается как есть на вход SAXTransformerFactory, за исключением того самого аттрибута который надо изменить.

Автор: Entry_N3 21.3.2007, 12:42
нужно через DOM

Добавлено @ 12:43 
LSD, 2 ссылки на одну постоянную страницу

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

Исправил.

Автор: Entry_N3 23.3.2007, 22:34
постоил DOM модель, и воспользовался методами getElementsByTagName и setNodeValue

Автор: NiТR0 30.1.2008, 17:14
Так изменятся только значения узлов... А как быть с атрибутами???

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

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

Автор: NiТR0 30.1.2008, 18:15
Хотелось узнать , как можно изменить атрибут, а не значение узла (если пользоваться 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", но никак не получается.

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

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

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

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

Автор: 3Maestro3 10.2.2008, 14:29
Народ, ХЕЛП! Никак не получается изменить значение тэга в 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

господа, что делать, как говорил Чернышевский?

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

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

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

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

Автор: 3Maestro3 11.2.2008, 20:50
Уважаемый, зачем так грубо? Мне нужно изменить значения, хранимые в 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, следует создать входящий и исходящий потоки. Подскажите как это сделать в конкретном моём случае!!

Автор: nornad 12.2.2008, 02:23
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());
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)