Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 20.07.2008
Сообщений: 67

Проблема с редактированием узлов дерева, которые являются XML элементами

25.08.2009, 17:54. Показов 3481. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемый ALL!
Есть следующая задача: данные из XML
должны отображаться следующим образом:
часть данных в виде дерева(ноды root,
levels, level1, ..., leveln), остальные
в виде таблицы. При клике на нодах level1,
levele2, ... должны отображатся только
их дочерние элементы.
Структура XML:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    <root>
     <levels>
        <level1>
           <item1>a1</item1>
           <item2>a2</item2>
            .... 
        </level1>
        <level2>
           <item1>b1</item1>
           <item2>b2</item2>
            ....
        </level2>
         .....
         <leveln>
           <item1>z1</item1>
           <item2>z2</item2>
            ....
        </leveln>
     </levels>      
    </root>
Только ноды level1, level2, ...leveln должны
иметь возможность редактирования. Вроде ничего
сложного нет, но не получается. Вся надежда на ALL.
Заранее благодарен.
Код ниже:
----skipped------
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    // Building xml tree from file
    public void buildXmlTree(final File file) {
        try {
            DocumentBuilderFactory documentBuilderFactory =
                    DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setIgnoringElementContentWhitespace(true);
            documentBuilderFactory.setIgnoringComments(true);
            //documentBuilderFactory.setValidating(true);
            DocumentBuilder documentBuilder =
                    documentBuilderFactory.newDocumentBuilder();
            // Creation a DOM document`
            xmlDocument = documentBuilder.parse(file);
            //DomUtil.normalizeDocument(xmlDocument.getDocumentElement());
 
            // Create a Tree Model from the Document
            DomTreeModel model = new DomTreeModel(xmlDocument);
 
            // Create the JTree
            xmlTree = new JTree(model);
            xmlTree.setEditable(true);
            // Pick an angled line style
            xmlTree.putClientProperty('JTree.lineStyle', 'Angled');
            xmlTree.setShowsRootHandles(true);
 
            // Create a renderer
            DomTreeCellRenderer renderer = new DomTreeCellRenderer();
            // Create an editor
            DomTreeCellEditor editor = new DomTreeCellEditor(xmlTree);
 
            xmlTree.setCellRenderer(renderer);
            xmlTree.setCellEditor(editor);
            xmlTree.getSelectionModel().setSelectionMode(TreeSelectionModel.
                                                         SINGLE_TREE_SELECTION);
 
            mTreePane.getViewport().add(xmlTree, null);
            mTreePane.repaint();
        }
        catch (Exception e) {
            statusBar.setText('Error occured during file opening');
            statusBar.setForeground(Color.red);
            JOptionPane.showMessageDialog(this, 'Error try again ...',
                                          'Error ...',
                                          JOptionPane.ERROR_MESSAGE, null);
            //currentFileName = null;
            //updateCaption();
            e.printStackTrace();
        }
    }
----skipped------

TreeModel
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import javax.swing.tree.*;
import javax.swing.event.*;
import org.w3c.dom.*;
import java.util.*;
import org.xml.sax.*;
 
public class DomTreeModel implements TreeModel {
 
    private Document mDocument;
    private ArrayList listeners = new Array ent) {
        return true;
    }
 
    
     public boolean isCellEditable(EventObject event) {
       boolean result = false;
        if (event instanceof MouseEvent) {
         MouseEvent me = (MouseEvent) event;
       TreePath path = tree.getPathForLocation(me.getX(), me.getY());
            if (path != null && path.getPathCount() == LEVEL) {
                Node node = (Node) path.getLastPathComponent();
                if (node != null) {
                    result = true;
                }
            }
        }
        return result;
     }
 
    
    public Component getTreeCellEditorComponent(JTree tree,
                                                Object value,
                                                boolean selected,
                                                boolean expanded,
                                                boolean leaf,
                                                int row) {
        JTextField textField = (JTextField) getComponent();
        
        Color highlight = new Color(102, 255, 255);
        if (!leaf) {
            if (selected) {
                textField.setBackground(highlight);
                textField.setForeground(Color.black);
                
         textField.setText( ( ( (Node) value).getNodeName()).trim());
            }
            else {
                textField.setBackground(Color.white);
                textField.setForeground(Color.black);
                
         textField.setText( ( ( (Node) value).getNodeName()).trim());
            }
        }
        else {
            return null;
        }
        return textField;
    }
 
}
Проблема вероятно здесь в методе valueForPathChanged(TreePath path, Object newValue)
Как переименовать элемент ?
Может кто сталкивался...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.08.2009, 17:54
Ответы с готовыми решениями:

Создать список, элементами которого являются значения вершин каждого второго поддерева бинарного дерева
Доброго времени суток. Помогите пожалуйста с такой вот задачкой, нужно создать список, элементами которого являются значения вершин каждого...

Сформировать массив М3, элементами которого являются те члены М2, которые не присутствуют в М1
Данные два произвольных одномерные массивы целых чисел М1 и М2. Сформировать ма- сив М3, элементами которого являются те члены М2,...

Поиск удвоения букв в словах которые являются элементами массива
Добрый день! Вот возникла такая проблема. Есть три массива: list1 = list2 = ('carrot', 'potato','lettuce') list3 = {'milk',...

12
0 / 0 / 0
Регистрация: 20.07.2008
Сообщений: 67
26.08.2009, 11:11  [ТС]
Уважаемые ГУРУ!
Если вопрос настолько тривиальный, то киньте ссылочку где посмотреть можно, а то уж второй день над проблемой бьюсь....
Или это действительно проблема изменить в рантайме имя xml
элемента.
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
26.08.2009, 14:56
Удалить старый, добавить новый, перетащив содержимое из старого в новый.
0
0 / 0 / 0
Регистрация: 20.07.2008
Сообщений: 67
27.08.2009, 10:11  [ТС]
Уважаемый Danissimo,
по Вашему совету пробовал делать так
Java
1
2
3
4
5
6
7
8
9
  private void replaceNodeA(Node node,Node newNode)   { 
      if(node.hasChildNodes())      {  
       NodeList nl=node.getChildNodes();
       int n=nl.getLength(); 
       for(int i=0;i<n;++i)    
           newNode.appendChild(nl.item(0));   
     }    
     node.replaceChild(newNode, node);
  }
но в

Java
1
2
3
4
   public void valueForPathChanged(TreePath path, Object newValue) { 
        Node mNode = (Node) path.getLastPathComponent(); 
        replaceNode(mNode, (Node)newValue);
   }
вылетает
java.lang.ClassCastException java.lang.String
Any ideas.....
Заранеее благодарен.
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
27.08.2009, 13:20
XML
1
2
3
4
5
<xml>
    <element>
        <child>text</child>
    </element>
</xml>
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
 * xml.java
 * Bild date: 2003-06-20
 * Version: 1.0
 * Author: Danis Tazeev
 *
 * Developed by eVelopers Corporation - June, 2003
 *
 * Copyright (c) 1999-2003 eVelopers Corporation. All rights reserved.
 * This software is the confidential and proprietary information of
 * eVelopers Corporation. You shall not disclose such Confidential
 * Information and shall use it only in accordance with the terms of
 * the license agreement you entered into with eVelopers.
 */
 
import java.io.*;
 
import org.w3c.dom.*;
 
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
 
class xml {
 
    public static void main(String [] atgs) throws Exception {
 
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse('xml.xml');
 
        System.out.println('Loaded.');
        rename(doc, doc.getDocumentElement(), 'element', 'parent');
        System.out.println('Renamed.');
 
        OutputStream os = new FileOutputStream('new.xml');
 
        TransformerFactory trnsf = TransformerFactory.newInstance();
        Transformer trns = trnsf.newTransformer();
        trns.transform(new DOMSource(doc), new StreamResult(os));
 
        os.flush();
        os.close();
    }
 
    private static void rename(
            Document doc, Element context, String oldChild, String newChild) {
 
        NodeList nl = context.getChildNodes();
        for(int i= 0; i < nl.getLength(); i++) {
            Node n = nl.item(i);
            if(n.getNodeType() == Node.ELEMENT_NODE) {
                Element childElement = (Element) n;
                if(childElement.getTagName() == oldChild) {
                    System.out.println('found');
                    Element newElement = doc.createElement(newChild);
                    copy(childElement, newElement);
                    System.out.println(context.replaceChild(newElement, childElement));
                    System.out.println(newElement);
                }
            }
        }
    }
 
    private static void copy(Element oldElement, Element newElement) {
        NodeList nl = oldElement.getChildNodes();
        for(int i = 0; i < nl.getLength(); i++)
            newElement.appendChild(nl.item(i).cloneNode(true));
    }
} ///:~
0
0 / 0 / 0
Регистрация: 20.07.2008
Сообщений: 67
31.08.2009, 12:53  [ТС]
Danissimo, cпасибо большое за помощь, но у меня xml типа:
XML
1
2
3
4
5
6
7
8
9
10
11
12
<root> 
 <levels>
     <level1>
        <item1>aaa1</item1>
        <item2>bbb1</item2>
     </level1>
     <level2>
        <item1>aaa2</item1>
        <item2>bbb2</item2>
     </level2> 
 </levels>
</root>
а менять надо ноды level1, level2, .....
Приведенный Вами кодом разрешает лишь переименовывать ноду LEVELS,
пробовал еще так
Java
1
2
3
4
5
6
7
8
9
10
    Element element = doc.getDocumentElement();   
    Element element2 = doc.createElement('newname');
    
    // Move all the children
    while (element.hasChildNodes()) {
        element2.appendChild(element.getFirstChild());
    }
    
    // Replace the old node with the new node
    element.getParentNode().replaceChild(element2, element);
результат тот же
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
31.08.2009, 13:05
sereduk, а разобраться в моем коде не пробовал? ) Ты ж понимаешь, что здесь люди не пишут готовых программ. В коде, что я прислал, -- законченная идея, причем 100% рабочая -- это им же (кодом) и демонстрируется.

Судя по тому, что ты сюда постишь, ты даже не потрудился разобраться!

Уж не обессуть, но в таком случае я ничем помочь не могу. Программу за тебя никто писать не будет, если только не заплатишь )

См. внимательно (!!!) на метод rename(). Там написано cloneNode(true), или что-то в этом роде.
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
31.08.2009, 13:15
Прошу прощения, я ошибся. Не rename(), а copy(). )
0
0 / 0 / 0
Регистрация: 20.07.2008
Сообщений: 67
31.08.2009, 13:23  [ТС]
Спасибо, разбираться разбирался и сейчас разберуюсь дальше,
на copy() тоже смотрю . Идея твоя понятна, стараюсь воплотить ее.
0
0 / 0 / 0
Регистрация: 20.07.2008
Сообщений: 67
01.09.2009, 11:11  [ТС]
Спасибо большое Danissimo, если кому интересно, то изменение нужной ноды
делается таким образом
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private static void rename(
  Document doc,
  Element context,
  String oldChild,
  String newChild) {
    NodeList nl = context.getChildNodes();
    for (int i = 0; i < nl.getLength(); i++) {
        Node n = nl.item(i);
        if (n.getNodeType() == Node.ELEMENT_NODE) {
            Element childElement = (Element) n;
            if (childElement.getTagName() == oldChild) {
                System.out.println('found');
                Element newElement = doc.createElement(newChild);
                copy(childElement, newElement);
                System.out.println(
                context.replaceChild(newElement, childElement));
            }
        }
    }
}
private static void copy(Element oldElement, Element newElement) {
    NodeList nl = oldElement.getChildNodes();
    System.out.println(nl.toString());
    for (int i = 0; i < nl.getLength(); i++) {
    newElement.appendChild(nl.item(i).cloneNode(true));
    }
}
a потом
Java
1
rename(doc, (Element)(doc.getElementsByTagName('levels').item(0)), 'level2', 'new_level2');
и аналогично с нодами, которые необходимо переименовать, но
остается вопрос:
если я данный метод пытаюсь использовать в
Java
1
2
3
4
 public void valueForPathChanged(TreePath path, Object newValue) {
        Node mNode = (Node) path.getLastPathComponent();
        rename(doc, (Element)(doc.getElementsByTagName('levels').item(0)), mNode.getNodeName().trim(), (String)newValue);
}
то ничего не происходит и exceptions нет никаких,
в данном случае надо еще листенер, который реагирует на изменение ноды.....потому как я понимаю xml модель меняется, но надо
еще правильно отобразить новую ноду в JTree
Или в какую сторону копать...
Заранее благодарен.
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
01.09.2009, 14:47
Да, естественно. После того, ка поменялись отображаемые данные, нужно попросить того, кто их отображает, обновить свой вид. В swing'е я не силен, но, по-моему, нужен ен лисенер. Это ведь не асинхронное изменение данных. Момент изменения данных известен -- ты сам это изменение инициируешь. После того, как можель данных поменялась, попроси дерево обновиться. Кажется, есть метод update() у всех наследников Component'а.

cheers )
0
0 / 0 / 0
Регистрация: 20.07.2008
Сообщений: 67
02.09.2009, 16:49  [ТС]
Спасибо большое всем ответившим и не ответившим тоже,
если кому интересно,

---skipped---
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
private EventListenerList listenerList = new EventListenerList();
 
protected void fireTreeStructureChanged(Object oldNode) {
        System.out.println('Inside fire...');
        TreeModelEvent event
                //= new TreeModelEvent(this, new Object[] {oldNode});
                  = new TreeModelEvent(mDocument, new Object[] {oldNode});
        EventListener[] listeners = listenerList.getListeners(
                TreeModelListener.class);
        for (int i = 0; i < listeners.length; i++) {
            ( (TreeModelListener) listeners[i]).treeStructureChanged(
                    event);
        }
    }
 
public void valueForPathChanged(TreePath path, Object newValue) {
        System.out.println('DEBUG: inside valueForPathChanged method...');
        Node mNode = (Node) path.getLastPathComponent();
        rename(mDocument,
               (Element) mDocument.getElementsByTagName('sections').item(0),
               mNode.getNodeValue(),
               (String) newValue);
        System.out.println('Renamed....');
        fireTreeStructureChanged(mNode);
        //tree.updateUI();
}
 
public void addTreeModelListener(TreeModelListener mListener) {
        listenerList.add(TreeModelListener.class, mListener);
}
 
public void removeTreeModelListener(TreeModelListener mListener) {
     if (mListener != null) {
 
       listenerList.remove(TreeModelListener.class, mListener);
   }
}
----skipped---------

но паралельно возник новый вопрос:
после изменения ноды дерево сворачивается,
и только развернув его снова, видны изменения

Как избежать сворачивания дерева....
Спасибо.
0
0 / 0 / 0
Регистрация: 20.07.2008
Сообщений: 67
07.09.2009, 11:59  [ТС]
Если все таки кому интересно, то проблема решилась так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public void valueForPathChanged(TreePath path, Object newValue) {
 
        Node mNode = (Node) path.getLastPathComponent();
        rename(
                mDocument,
                (Element) mDocument.getElementsByTagName(mNode.getParentNode().
                getNodeName().trim()).item(0),
                mNode.getNodeName(),
                (String) newValue);
        fireTreeStructureChanged(mNode);
        Node searchedNode = null;
        NodeList nl = mDocument.getDocumentElement().getFirstChild().
                getChildNodes();
            for (int i = 0; i < nl.getLength(); i++) {
            String s = nl.item(i).getNodeName();
            System.out.println(s);
            if (nl.item(i).getNodeName().trim().equals( (String) newValue)) {
               searchedNode = nl.item(i);
               break;
            }
        }
        Object[] nodes = {
                mDocument.getDocumentElement(), searchedNode.getParentNode(),
                searchedNode
        };
        xmlTree.repaint();
        TreePath newPath = new TreePath(nodes);
        xmlTree.scrollPathToVisible(newPath);
        xmlTree.makeVisible(newPath);
        xmlTree.expandPath(newPath);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.09.2009, 11:59
Помогаю со студенческими работами здесь

Проверить существование под-узлов у узлов корневого элемента Xml файла
Есть следующий код для получения имен всех под-узлов корневого элемента Xml файла: List&lt;string&gt; nodes = new List&lt;string&gt;(); ...

Опросник. Создание дерева зависимостей в treeView, сохранение дерева в XML, построение дерева в treeView из XML
Всем доброго времени суток. Тема является продолжением вот этой темы. Создаю 2ю, так как там был другой вопрос, который скорее...

Упорядочить по возрастанию числа A, B и C, которые являются минимальными элементами соответствующих массивов
1. Заданы три массива , , . Упорядочить по возрастанию числа A, B и C, которые являются минимальными элементами соответствующих массивов....

Массив: создать одномерный массив, элементами которого являются двумерные массивы, элементами которых являются записи
создать одномерный массив, элементами которого являются двумерные массивы, элементами которых являются записи с полями целочисленного,...

В рабочей программе добавить для дерева бинарного поиска нахождение отрицательных значений узлов дерева
Полностью готовая программа, но что дописать в мейне чтобы он выводил произведение отрицательных узлов???:-| using System; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru