簡體   English   中英

使用Stax在XML文件中搜索字符串

[英]Search Strings in XML file using Stax

我正在使用stsx在xml文件的“ rules”標記下的xsd部分中搜索字符串“ t_val_calc_pwr_consumed”和“ t_val_calc_enrg_accumulated”。 當我嘗試在每個“ ElementDefinitionModel”標簽的規則部分中搜索時,出現空指針異常

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();

問題是您嘗試在“規則”標簽中找到屬性“ 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);
       }
    }
}     

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM