2014-01-27 1 views
-1

Я создал метод удаления. Мой метод имеет индекс как аргумент, который исходит из позиции jlist. Метод получит позицию из jlist, которую пользователь нажал, и найдите этот элемент в xml и удалите его и всех дочерних элементов.Удаление элементов xml не работает из-за нулевого значения

Таким образом, если пользователь нажмет TrainCategorySpeed ​​имеет индекс 122 и будет искать для этого типа в XML

<type> 
    <OBJECT_TYPE>TrainCategorySpeed</OBJECT_TYPE> 
- <prop> 
    <DESCRIPTION>Differential speed limit</DESCRIPTION> 
    <PARENT>NULL</PARENT> 
    <VIRTUAL>0</VIRTUAL> 
    <VISIBLE>0</VISIBLE> 
    <PICTURE>NULL</PICTURE> 
    <HELP>NULL</HELP> 
    <MIN_NO>NULL</MIN_NO> 
    <MAX_NO>NULL</MAX_NO> 
    <NAME_FORMAT>NULL</NAME_FORMAT> 
    </prop> 
- <param> 
    <PARAMETER>trainCategory</PARAMETER> 
    <DATA_TYPE>INTEGER</DATA_TYPE> 
    <DESCRIPTION>Train category</DESCRIPTION> 
    <MIN_NO>1</MIN_NO> 
    <MAX_NO>1</MAX_NO> 
    <ORDER1>1</ORDER1> 
    <NESTED>1</NESTED> 
    <DEFAULT1>NULL</DEFAULT1> 
    <FORMAT>0:15</FORMAT> 
    </param> 
- <param> 
    <PARAMETER>speed</PARAMETER> 
    <DATA_TYPE>INTEGER</DATA_TYPE> 
    <DESCRIPTION>Speed (km/h (V_DIFF))</DESCRIPTION> 
    <MIN_NO>1</MIN_NO> 
    <MAX_NO>1</MAX_NO> 
    <ORDER1>2</ORDER1> 
    <NESTED>1</NESTED> 
    <DEFAULT1>NULL</DEFAULT1> 
    <FORMAT>0:600:5</FORMAT> 
    </param> 
    </type> 

Но когда я пытаюсь добиться этого он дает мне исключение NullPointer

на происходит некорректно line: Node type = doc.getElementsByTagName("type").item(x); x здесь действительно дает правильное положение и тип - это элемент в xml. , но тип пуст.

Это остальная часть метода:

public void deleteObjType(int x) { 

     System.out.println("index : " + x); // This one will return index : 122 in the console and it does 

     File file = new File("xmlFiles/CoreDatamodel.xml"); 
     DocumentBuilderFactory builderFactory = DocumentBuilderFactory 
       .newInstance(); 
     try { 
      DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
      builder = builderFactory.newDocumentBuilder(); 
      Document doc = builder.parse(file); 

      Node type = doc.getElementsByTagName("type").item(x); 
      System.out.println("type : " + type); 

      NodeList nodes = type.getChildNodes(); 

      for (int i = 0; i < nodes.getLength(); i++) { 

       Node element = nodes.item(x); 
       System.out.println("element : " + element); 

       // remove node 
       if ("OBJECT_TYPE".equals(element.getNodeName())) { 
        type.removeChild(element); 
       } 

      } 

      // Save the new update 
      save(file, doc); 

     } catch (ParserConfigurationException e) { 

      e.printStackTrace(); 
     } catch (SAXException e) { 

      e.printStackTrace(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } catch (XPathExpressionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

Полный StackTrace:

java.lang.NullPointerException 
    at cxmleditor.service.XMLEditorService.deleteObjType(XMLEditorService.java:106) 
    at xmleditor.gui.XmlEditorMain$deleteObjType.actionPerformed(XmlEditorMain.java:383) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.AbstractButton.doClick(Unknown Source) 
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source) 
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source) 
    at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
+0

Ваш вопрос очень неясен. В названии говорится, что у вас проблемы с удалением, но в вашем вопросе говорится, что проблема заключается в _общем_ удалении узла. Просьба уточнить. –

+0

Хорошо, я отредактировал заголовок. но эта строка кода дает мне null: Тип узла = doc.getElementsByTagName («type»). item (x); И он должен с тех пор, как ther eis в моем XML-файле. – Sembrano

+0

Первое правило SO: Если у вас есть исключение, отправьте ПОЛНУЮ СТОЙКУ. –

ответ

0

Я думаю, ваша проблема заключается в следующей строке:

for (int i = 0; i < nodes.getLength(); i++) { 

Обратите внимание, что я не должен приращение при удалении узла.

+0

До этого значения в этом коде: Тип узла = doc.getElementsByTagName ("type"). Item (x); – Sembrano

0

Проблема не в том, что ваш объект типа имеет значение null. Когда deleteObjType (0); вызывается простым XML вы предоставили,

System.out.println("type : " + type); 

использует только ToString() - метод экземпляра объекта типа и печатает:

type : [type: null] 

если вы вместо того, чтобы сделать

System.out.println("type : " +type); 
if(type == null) { 
    System.out.println("type is null!"); 
}else { 
    System.out.println("type is not null but an instance of ["+type.getClass().getCanonicalName()+"]"); 
} 

он печатает в моем случае:

type is not null but an instance of [com.sun.org.apache.xerces.internal.dom.DeferredElementImpl] 

DOM также немного сложнее, чем узлы элементов, имеющие узлы прямого элемента в виде дочерних элементов as you can see here. Я узнал из практики, что просто распечатывать узлы обычно недостаточно. Какую часть xml вы действительно хотите удалить?

+0

Вся эта часть xml, которую я опубликовал, хочу удалить. I ogt 122 , и это только один из них. – Sembrano

Смежные вопросы