2015-09-02 2 views
1

У меня есть некоторые проблемы, когда я использую if заявления внутри for цикла, чтобы удалить некоторые узлы в документе XML, потому что я не понимаю, почему мои счетчики стали 0 после поставить if заявления:Java XPath «если» заявление

public static void main(String[] args) throws Exception { 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    Document document = dbf.newDocumentBuilder().parse(new File("input3.xml")); 


    XPathFactory xpf = XPathFactory.newInstance(); 
    XPath xpath = xpf.newXPath(); 

    XPathExpression expres = xpath.compile("//TNMS/TPaths/TPath[Topology/LayerSet/NonTerminatedLayers/Layer='RS64']"); 
    NodeList PathsCount = (NodeList) expres.evaluate(document, XPathConstants.NODESET); 

    System.out.println("Inicia el Borrado:"); 

    for (int i = 0; i < PathsCount.getLength(); i++) 
    { 
     System.out.println(i); 

     XPathExpression exprueba = xpath.compile("/TNMS/TPaths/TPath[1]/Topology/LayerSet/TerminatedLayers"); 
     NodeList Count = (NodeList) exprueba.evaluate(document, XPathConstants.NODESET); 
     System.out.println("Hay " + Count.getLength()); 
     int countvar = Count.getLength(); 

     XPathExpression expression = xpath.compile("//TNMS/TPaths/TPath[Topology/LayerSet/NonTerminatedLayers/Layer='RS64']"); 
     Node b13Node = (Node) expression.evaluate(document, XPathConstants.NODE); 
     b13Node.getParentNode().removeChild(b13Node); 
    } 

я вижу рядом с выходом:

Inicia el Borrado: 
0 

Hay 0 

1 

Hay 1 

2 

Hay 1 

3 

Hay 0 

<?xml version="1.0" encoding="UTF-8" standalone="no"?><TNMS> 
    <TPaths> 

    </TPaths> 
</TNMS>BUILD SUCCESSFUL (total time: 0 seconds) 

Но когда я согласен с if заявление:

public static void main(String[] args) throws Exception { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     Document document = dbf.newDocumentBuilder().parse(new File("input3.xml")); 


     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xpath = xpf.newXPath(); 

     XPathExpression expres = xpath.compile("//TNMS/TPaths/TPath[Topology/LayerSet/NonTerminatedLayers/Layer='RS64']"); 
     NodeList PathsCount = (NodeList) expres.evaluate(document, XPathConstants.NODESET); 

     System.out.println("Inicia el Borrado:"); 

     for (int i = 0; i < PathsCount.getLength(); i++) 
     { 
      System.out.println(i); 

      XPathExpression exprueba = xpath.compile("/TNMS/TPaths/TPath[1]/Topology/LayerSet/TerminatedLayers"); 
      NodeList Count = (NodeList) exprueba.evaluate(document, XPathConstants.NODESET); 
      System.out.println("Hay " + Count.getLength()); 
      int countvar = Count.getLength(); 

      if (countvar == 1) { 
       XPathExpression expression = xpath.compile("//TNMS/TPaths/TPath[Topology/LayerSet/NonTerminatedLayers/Layer='RS64']"); 
       Node b13Node = (Node) expression.evaluate(document, XPathConstants.NODE); 
       b13Node.getParentNode().removeChild(b13Node); 
      } 
     } 

выход является следующим:

Inicia el Borrado: 
0 

Hay 0 

1 

Hay 0 

2 

Hay 0 

3 

Hay 0 

и стирания не удалось.

Любые идеи?

+0

Каков ваш ожидаемый результат? Код внутри оператора 'if' будет выполняться только в том случае, если' countvar' равно 1. Но что меняется 'countvar'? Это когда-нибудь меняется? – alondono

+1

Пожалуйста, обратите внимание на отправку источника XML. Если проблема в ваших выражениях XPath, нет способа проверить это, не видя ваш источник XML. – sideshowbarker

+0

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

ответ

0

Вы должны оценивать свои выражения xpath внутри цикла for относительно узлов, через которые выполняется итерация. В вашем коде вы продолжаете ссылаться на TPath[1], который вызывает всевозможные странные проблемы.

Оцените свои выражения xpath относительно текущего узла TPaths, который вы сохранили в своем NodeList.

for (int i = 0; i < PathsCount.getLength(); i++) 
{ 
    Node tPathsChild = PathsCount.item(i); 
    System.out.println(i); 

    // get the number of TerminatedLayers elements. 
    XPathExpression exprueba = xpath.compile("Topology/LayerSet/TerminatedLayers"); 
    NodeList Count = (NodeList) exprueba.evaluate(tPathsChild, XPathConstants.NODESET); 
    System.out.println("Hay " + Count.getLength()); 
    int countvar = Count.getLength(); 

    // remove this child if there are only 1 of them. 
    if (countvar == 1) { 
     tPathsChild.getParentNode().removeChild(tPathsChild); 
    } 
} 

FYI: соглашения об именах Java являются camelCase. Его трудно прочитать, если они не в этом формате для Java-программиста.

+0

Эй, спасибо большое, ну Im новое на Java и новое в программировании данных, я работал над оборудованием, поэтому я извиняюсь об этом. но он работает для меня, и вы узнаете, как вы объясните свое объяснение и верблюд, который вы написали. –

0

вы должны отлаживать его, но я думаю, что его из-за Count.getLength() возвращает 0 и ваш, если Постулаты будет выполняться только тогда, когда она возвращает 1

то будет, вероятно, потому, что при запуске программы в первый раз он удален узлов и вы не сделали восстановил файл, когда вы попробовали его, если statment, так что ваш файл пуст

+0

ну, я попробую .. –

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