2015-03-31 2 views
0

Я использую stsx для поиска строк «t_val_calc_pwr_consumed» & «t_val_calc_enrg_accumulated» в разделе xsd в теге «rules» файла xml. Когда я пытаюсь найти в разделе правил каждого тега "ElementDefinitionModel", я получаю исключения нулевого указателяПоиск строк в файле XML с помощью Stax

XML файл ..

<elementDefinitionModel manufacturerInSymbol="CARLO GAVAZZI" minSupportedVersionInSymbol="1.4" modelInSymbol="EM24-DIN_AV9_3_X_IS" modelQualifierInSymbol="EM24-DIN_AV9_3_X_IS" symbolTag="CARLO$GAVAZZIEM24-DIN_AV9_3_X_ISEM24-DIN_AV9_3_X_IS"> 
    <rules> 
     <rule> 
      <r:collection enabled="true" level_one_interval="5" level_two_interval="15" mode="normalMode" name="CollectionRule_t_val_calc_enrg_interval"> 
       <r:datapoint programmaticName="t_val_calc_enrg_interval" /> 
       <r:normal> 
        <r:currentValue interval="300" /> 
       </r:normal> 
       <r:accelerated interval="30" /> 
       <r:computation formulaType="EnergyIntervalUsingAccEnergy" assignedDatapoint="t_val_calc_enrg_accumulated" formula="VAL(t_val_meter_enrg_phsA) VAL(t_val_meter_enrg_phsB) + VAL(t_val_meter_enrg_phsC) +" compFormula="VAL(t_val_meter_enrg_phsA) VAL(t_val_meter_enrg_phsB) + VAL(t_val_meter_enrg_phsC) +" /> 
       <r:aggregation> 
        <r:aggFunction>SUM</r:aggFunction> 
       </r:aggregation> 
      </r:collection> 
     </rule> 
     <rule> 
      <r:collection enabled="true" level_one_interval="5" level_two_interval="15" mode="normalMode" name="CollectionRule_t_val_calc_pwr_consumed"> 
       <r:datapoint programmaticName="t_val_calc_pwr_consumed" /> 
       <r:normal> 
        <r:currentValue interval="300" /> 
       </r:normal> 
       <r:accelerated interval="30" /> 
       <r:computation compFormula="VAL(t_val_meter_pwr_phsA) VAL(t_val_meter_pwr_phsB) + VAL(t_val_meter_pwr_phsC) +" formula="VAL(t_val_meter_pwr_phsA) VAL(t_val_meter_pwr_phsB) + VAL(t_val_meter_pwr_phsC) +" formulaType="ConsumedPower" /> 
      </r:collection> 
     </rule> 
     <rule> 
      <r:analysis enabled="false" name="AnalysisRule_t_val_calc_pwr_consumed" source="Engine"> 
       <r:datapoint programmaticName="t_val_calc_pwr_consumed" /> 
       <r:parametricThreshold> 
        <r:highCritical eventProgrammaticName="t_evt_dp_genericThrshldHighCritical" /> 
        <r:highWarning eventProgrammaticName="t_evt_dp_genericThrshldHighWarning" /> 
        <r:lowWarning eventProgrammaticName="t_evt_dp_genericThrshldLowWarning" /> 
        <r:lowCritical eventProgrammaticName="t_evt_dp_genericThrshldLowCritical" /> 
       </r:parametricThreshold> 
      </r:analysis> 
     </rule> 
    </rules> 
    </elementDefinitionModel> 

Java код ..

public class PUE_Checker { 

    public static void main(String[] args) throws XMLStreamException, ParserConfigurationException, SAXException, IOException{ 
    // TODO code application logic here 
    Integer count =0; 
    Integer x =0; 
    Integer size; 
    String PUE1; 
    String model; 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    org.w3c.dom.Document document = db.parse(new File("E:\\SVN\\R3.3\\DataDefinition\\file.xml")); 
    NodeList nodeList = document.getElementsByTagName("r:datapoint"); 
    for(x=0,size= nodeList.getLength(); x<size; x++) { 
     model= nodeList.item(x).getParentNode().getParentNode().getAttributes().getNamedItem("modelInSymbol").getNodeValue(); 
      if(model.length() > 0){ 
     PUE1 = nodeList.item(x).getAttributes().getNamedItem("programmaticName").getNodeValue(); 
     if("t_val_calc_pwr_consumed".equals(PUE1) || "t_val_calc_enrg_accumulated".equals(PUE1)){ 
     count++; 
     } 
     if(count==2){ 
     System.out.println("Points present in"+nodeList.item(x).getParentNode().getParentNode().getAttributes().getNamedItem("modelInSymbol").getNodeValue()); 
     } 
     } 
     }  
     } 
     } 

Ожидаемые результаты ..

Points present in EM24-DIN_AV9_3_X_IS 

Выходной ток

 Exception in thread "main" java.lang.NullPointerException 
at sample.PUE_Checker.main(PUE_Checker.java:37) 
Java Result: 1 

Edit 1:

Линия называется "PUE_Checker.java:37" является

model= nodeList.item(x).getParentNode().getParentNode().getAttributes().getNamedItem("modelInSymbol").getNodeValue(); 
+0

какая линия PUE_Checker.java:37? – vincent

+0

Я отредактировал свой вопрос соответственно .. – Lucy

+0

model = nodeList.item (x) .getParentNode(). GetParentNode() дает правило тэга no? который не имеет атрибутов. это может быть причиной вашего исключения nullPointerException. И вы ожидали правильного тега elementDefinitionModel? – vincent

ответ

0

Проблема заключается в том, что вы пытаетесь найти атрибут "modelInSymbol" в " правило ". Это приводит к исключению NullPointerException. Вы можете сделать это в два этапа: - найти атрибут «modelInSymbol» в элементе корневого тега - найти атрибут «programaticName» в «r: datapoint» и повторно использовать результат предыдущего поиска.

Как вы это делаете, вы ищете «modelInSymbol» для каждого «r: datapoint». Но есть только один.
Так что сделайте это в первый раз и используйте его каждый раз, когда вам это нужно.

Я сделал это в текстовом редакторе, так может быть, это не будет работать, но это может быть намек:

Element rootElement = xmlDocument.getDocumentElement(); 
String modelInSymbol = rootElement.getAttribute("modelInSymbol"); 

NodeList nodeList = document.getElementsByTagName("r:datapoint"); 
for(x=0,size= nodeList.getLength(); x<size; x++) { 
    if(modelInSymbol!= null && modelInSymbol.length() > 0){ 
     PUE1 = nodeList.item(x).getAttributes().getNamedItem("programmaticName").getNodeValue(); 
     if("t_val_calc_pwr_consumed".equals(PUE1) || "t_val_calc_enrg_accumulated".equals(PUE1)){ 
      count++; 
     } 
     if(count==2){ 
     System.out.println("Points present in"+modelInSymbol); 
     } 
    } 
}  
+0

ok .. если есть родительский узел для тега elementDefinitionModel, то будем ли мы использовать метод getFirstChild() в приведенном выше коде ??? – Lucy

+0

yes, getFirstChild будет хорошим решением – vincent

+0

Когда я использую строку «Node modelInSymbol1 = rootElement.getFirstChild();» в приведенном выше коде я получаю вывод «[#text:]» .. как удалить это? – Lucy

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