2015-03-31 64 views
0

我正在使用stsx在xml文件的「rules」標記下的xsd部分中搜索字符串「t_val_calc_pwr_consumed」&「t_val_calc_enrg_accumulated」。當我嘗試在每個 「ElementDefinitionModel」 標籤的規則部分進行搜索,我得到一個空指針異常使用Stax搜索XML文件中的字符串

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 

編輯1:

線被稱爲 「PUE_Checker.java:37」 是

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

這行是PUE_Checker.java:37? – vincent 2015-03-31 09:59:43

+0

我已經編輯了相應的問題。 – Lucy 2015-03-31 10:03:29

+0

model = nodeList.item(x).getParentNode()。getParentNode()給出標籤規則no?沒有屬性。這可能是您的nullPointerException的原因。 而你期待elementDefinitionModel標籤正確嗎? – vincent 2015-03-31 10:04:54

回答

0

的問題是,你試圖找到在屬性 「modelInSymbol」 的「規則「標籤。這導致NullPointerException。 您可以分兩步進行: - 在根標記元素 中搜索屬性「modelInSymbol」 - 在「r:datapoint」中搜索屬性「programmaticName」並重新使用前面的搜索結果。

通過這種方式,您可以爲每個「r:datapoint」搜索「modelInSymbol」。但只有一個。
因此,第一次做到這一點,並在每次需要時重複使用它。

我在文本編輯器這樣做,可能是它不會工作,但它可能是一個暗示:

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 2015-03-31 13:31:25

+0

是的,getFirstChild將是一個很好的解決方案 – vincent 2015-03-31 13:37:49

+0

當我使用行「節點modelInSymbol1 = rootElement.getFirstChild();」在上面的代碼中,我得到了輸出「[#text:]」..如何刪除? – Lucy 2015-03-31 14:04:26