2013-04-18 3 views
0

// ** Получить нуль в NodeList nList = doc.getElementsByTagName (e); Ниже мой xml-контент Я пытаюсь удалить похожие теги, присутствующие в XML-файле. nList показывает null. Как подойти к проблеме?Проблема с расширением XML-файла с использованием java?

**

public class DelElement { 
public static String parent; 
public static void main(String[] args) { 

    try { 

     File file = new File("D:/vodafone/parse.xml"); 

     DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance() 
     .newDocumentBuilder(); 

     Document doc = dBuilder.parse(file); 

     System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); 
     parent=doc.getDocumentElement().getNodeName(); 
     if (doc.hasChildNodes()) { 

      printNote(doc,doc.getChildNodes()); 

     } 

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

} 

private static void printNote(Document doc, NodeList nodeList) throws TransformerException { 



    String file = "D:/vodafone/parse.xml"; 

    for (int count = 0; count < nodeList.getLength(); count++) { 

     Node tempNode = nodeList.item(count); 

     // make sure it's element node. 
     if (tempNode.getNodeType() == Node.ELEMENT_NODE) { 

      // get node name and value 
      System.out.println("\nNode Name =" + tempNode.getNodeName() + " [OPEN]"); 
      System.out.println("Node Value =" + tempNode.getTextContent()); 

      if(tempNode.getNodeName()!=parent){ 





       System.out.println("----------------------------"); 



       if (tempNode.getChildNodes().getLength()>1){ 
        NodeList nodeMap=tempNode.getChildNodes(); 
        System.out.println("inside del"); 

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



         String e = "'"+(String)nodeMap.item(i).getNodeName()+"'"; 

         System.out.println("inside del node:"+e); 
         NodeList nList = doc.getElementsByTagName(e); 

         if (nList.getLength()>1){ 

          for (int con=1;i==nList.getLength()-1;con++){ 

           Element el = (Element)nList.item(con); 
           System.out.println("element"+el); 
           System.out.println("parent"+el.getParentNode()); 
           el.getParentNode().removeChild(el); 
          } 
          TransformerFactory transformerFactory = TransformerFactory.newInstance(); 

          Transformer transformer = transformerFactory.newTransformer(); 
          transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
          DOMSource source = new DOMSource(doc); 
          StreamResult result = new StreamResult(new File(file)); 
          transformer.transform(source, result); 
         } 
        }}} 

      if (tempNode.hasChildNodes()) { 

       // loop again if has child nodes 
       printNote(doc, tempNode.getChildNodes()); 

      } 

      System.out.println("Node Name =" + tempNode.getNodeName() + " [CLOSE]"); 

     } 

    } 

}} 
+0

<тестовое значение = "Хай" /> <тестовое значение = "Хай" /> \t <тестовое значение = "Хай" /> \t <тестовое значение = "Хай" /> <тестовое значение = «хаи» /> knix2

+0

в вышеприведенных тегах пытаются удалить тегов, присутствующие внутри и тегов. – knix2

+0

Измените свой вопрос, а не добавьте комментарии. –

ответ

-1

Похоже, когда вы звоните

doc.getElementsByTagName(e); 

значение е что-то вроде «теста». Однако само имя элемента в XML - это просто «тест» (без одинарных кавычек). Вероятно, ваш преступник

+0

Я добавил только одну цитату позже. Я тоже пробовал без этого .. Он все еще возвращает нуль. – knix2

1

Проблема, кажется, в вашем «цикле цикла», где вы пытаетесь удалить узлы. Ваш цикл говорит :: "for (int con = 1; i == nList.getLength() - 1; con ++) {" ... На основе вашего кода условие разрыва цикла "i == nList.getLength () -1 "всегда верно, поэтому он никогда не попадает внутрь этого блока ...

Я считаю, что это то, что вы должны делать (все еще чувствуете себя немного запутанным способом сделать очень маленькую работу, м угадывают вы просто делитесь частью головоломки ... ниже, это приведет к удалению узлов ...

     for (int con=nList.getLength()-1; con>=0; con--) { 
          Element el = (Element)nList.item(con); 
          System.out.println("element"+el); 
          System.out.println("parent"+el.getParentNode()); 
          el.getParentNode().removeChild(el); 
         } 
         /* 
         for (int con=1;i==nList.getLength()-1;con++){ 

          Element el = (Element)nList.item(con); 
          System.out.println("element"+el); 
          System.out.println("parent"+el.getParentNode()); 
          el.getParentNode().removeChild(el); 
         } 
         */ 

Надеется, что это помогает

+0

Нет. Я получаю null в NodeList nList = doc.getElementsByTagName (e); здесь e = 'test' .. – knix2

+0

Вместо имени тега я использую это: if (tempNode.getChildNodes(). GetLength()> 1) { NodeList nList = tempNode.getChildNodes(); for (int con = nList.getLength() - 1; con> 0; con -) { } Здесь nList.getLength() возвращает 7 .. Его печать: ** element [#text: * * ] – knix2

+0

Во-первых, «получение нулевого» означает, что программа бросает NullPointerException? Потому что это не для меня. Можете ли вы поделиться своим точным кодом? Также, какую версию Java вы используете? –

0

Использование Xpath:.

Document doc = ... 
    XPath xp = XPathFactory.newInstance().newXPath(); 
    NodeList nodes = (NodeList) xp.evaluate("//sai/test | //dinesh/test", doc, XPathConstants.NODESET); 
    for (int i = 0; i < nodes.getLength(); ++i) { 
     Node node = nodes.item(i); 
     node.getParentNode().removeChild(node); 
    } 

    TransformerFactory tf .... 

UPDATE:

Код выше, является лишь примером того, что вы можете сделать: Другой подход мог бы найти все узлы элементов, которые имеют более чем один < тест> ребенка, а затем сделать некоторые дальнейшей обработки для удаления дубликатами:

NodeList nodes = (NodeList) xp.evaluate("//node()[count(./test) > 1", doc, XPathConstants.NODESET); 
    for (int i = 0; i < nodes.getLength(); ++i) { 
     Node parent= nodes.item(i); 
     checkAndRemoveDuplicates(parent); 
    } 

смысл всего этого в том, что XPath является мощным инструментом, который может помочь вам решить проблему с гораздо меньшим количеством кода.

+0

Здесь я должен проверить, существует ли более одного узла с тем же именем ... тогда удаление всех копий должно быть выполнено, кроме одного. – knix2

+0

Не стесняйтесь делать все, что хотите. –

+0

Что делать, если мне нужно удалить все узлы, кроме одного, с тем же именем тега и значением атрибута? Как Здесь мне нужно удалить один полный узел , когда оба атрибута и имя узла одинаковы? – knix2

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