【问题标题】:Search Strings in XML file using Stax使用 Stax 在 XML 文件中搜索字符串
【发布时间】:2015-06-04 14:49:41
【问题描述】:

我正在使用 stsx 在 xml 文件的“规则”标签下的 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();

【问题讨论】:

  • PUE_Checker.java:37 是哪一行?
  • 我已经相应地编辑了我的问题..
  • model= nodeList.item(x).getParentNode().getParentNode() 给标签规则没有?没有属性。这可能是您的 nullPointerException 的原因。你期待 elementDefinitionModel 标签对吗?
  • 通过使用第 37 行,我希望获得 elementDefinitionModel 标签的“modelInSymbol”属性的值。你知道如何获得它吗??
  • modelInSymbol 似乎是您的根元素的一个属性。所以我不明白你为什么要搜索标签名称“r:datapoint”。

标签: java xml xsd string-parsing stax


【解决方案1】:

问题是您试图在“规则”标签中找到属性“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);
       }
    }
}     

【讨论】:

  • ok..如果有elementDefinitionModel标签的父节点那么我们会使用上面代码中的getFirstChild()方法吗??
  • 当我使用“Node modelInSymbol1 = rootElement.getFirstChild();”这一行时在上面的代码中,我得到输出“[#text: ]”.. 如何删除它??
  • 肯定是因为您尝试打印整个节点元素而不是他的值。不要犹豫看javadoc docs.oracle.com/javase/6/docs/api/org/w3c/dom/Node.html
  • 即使将上面的行更改为“String modelInSymbol1 = rootElement.getFirstChild().getNodeValue();”我得到空白值...为什么??
  • 因为如果 rootElement 是 elementDefinitionModel 第一个孩子是“规则”并且没有价值。调试器可以帮到你很多。
猜你喜欢
  • 1970-01-01
  • 2016-03-10
  • 2011-06-06
  • 2012-05-17
  • 2016-12-24
  • 2014-03-18
  • 2016-05-14
  • 1970-01-01
相关资源
最近更新 更多