2012-02-27 82 views
0

以下是XML文件的一部分。我需要找到一个与之相关联的得分的所有节点和所有SimplePredicates导致每个分数产生规则集 例子:java xpath搜索文本

if (GRAVH.1 <= 2751.5996775) && (WV.unity <= 93.567676535) && (Zagreb <= 74) 
{ 
score = 2.32 
} 

是否有可能与Java的XPath 这里做,这是XML文件..

</MiningSchema> 
     <Node id="1"> 
      <True/> 
      <Node id="2"> 
      <SimplePredicate field="GRAVH.1" operator="lessOrEqual" value="2751.5996775"/> 
      <Node id="4"> 
      <SimplePredicate field="WV.unity" operator="lessOrEqual" value="93.567676535"/> 
      <Node id="8"> 
      <SimplePredicate field="Zagreb" operator="lessOrEqual" value="74"/> 
      <Node id="16" score="2.32"> 
       <SimplePredicate field="VP.0" operator="lessOrEqual" value="6.047602111"/> 
      </Node> 
      <Node id="17"> 
       <SimplePredicate field="VP.0" operator="greaterThan" value="6.047602111"/> 
       <Node id="28" score="2.832"> 
       <SimplePredicate field="MOMI.Y" operator="lessOrEqual" value="838.9644494"/> 
       </Node> 
       <Node id="29" score="3.1075"> 
       <SimplePredicate field="MOMI.Y" operator="greaterThan" value="838.9644494"/> 
       </Node> 
      </Node> 
      </Node> 
      <Node id="9"> 
      <SimplePredicate field="Zagreb" operator="greaterThan" value="74"/> 
      <Node id="18" score="3.4"> 
       <SimplePredicate field="SP.0" operator="lessOrEqual" value="11.10848385"/> 
      </Node> 
      <Node id="19"> 
       <SimplePredicate field="SP.0" operator="greaterThan" value="11.10848385"/> 
       <Node id="30" score="3.81333333333333"> 
       <SimplePredicate field="MobCSA" operator="lessOrEqual" value="135.12"/> 
       </Node> 
       <Node id="31" score="4.04"> 
       <SimplePredicate field="MobCSA" operator="greaterThan" value="135.12"/> 
       </Node> 
      </Node> 
      </Node> 
      </Node> 
      <Node id="5"> 
      <SimplePredicate field="WV.unity" operator="greaterThan" value="93.567676535"/> 
      <Node id="10"> 
      <SimplePredicate field="VP.7" operator="lessOrEqual" value="0.583140169"/> 
      <Node id="20"> 
       <SimplePredicate field="apol" operator="lessOrEqual" value="50.9146355"/> 
       <Node id="32" score="4.48"> 
       <SimplePredicate field="MOMI.Z" operator="lessOrEqual" value="791.5388999"/> 
       </Node> 
       <Node id="33" score="4.848"> 
       <SimplePredicate field="MOMI.Z" operator="greaterThan" value="791.5388999"/> 
       </Node> 
      </Node> 
      <Node id="21" score="5.14"> 
       <SimplePredicate field="apol" operator="greaterThan" value="50.9146355"/> 
      </Node> 
      </Node> 
      <Node id="11"> 
      <SimplePredicate field="VP.7" operator="greaterThan" value="0.583140169"/> 
      <Node id="22"> 
       <SimplePredicate field="WPATH" operator="lessOrEqual" value="1502"/> 
       <Node id="34" score="5.638"> 
       <SimplePredicate field="WPATH" operator="lessOrEqual" value="1440.5"/> 
       </Node> 
       <Node id="35" score="5.45"> 
       <SimplePredicate field="WPATH" operator="greaterThan" value="1440.5"/> 
       </Node> 
      </Node> 
      <Node id="23" score="5.922"> 
       <SimplePredicate field="WPATH" operator="greaterThan" value="1502"/> 
      </Node> 
      </Node> 
      </Node> 
      </Node> 
      <Node id="3"> 
      <SimplePredicate field="GRAVH.1" operator="greaterThan" value="2751.5996775"/> 
      <Node id="6"> 
      <SimplePredicate field="ECCEN" operator="lessOrEqual" value="849"/> 
      <Node id="12"> 
      <SimplePredicate field="MOMI.Y" operator="lessOrEqual" value="8736.7661745"/> 
      <Node id="24" score="6.37"> 
       <SimplePredicate field="MOMI.R" operator="lessOrEqual" value="8.2680425545"/> 
      </Node> 
      <Node id="25" score="6.7925"> 
       <SimplePredicate field="MOMI.R" operator="greaterThan" value="8.2680425545"/> 
      </Node> 
      </Node> 
      <Node id="13" score="7.61"> 
      <SimplePredicate field="MOMI.Y" operator="greaterThan" value="8736.7661745"/> 
      </Node> 
      </Node> 
      <Node id="7"> 
      <SimplePredicate field="ECCEN" operator="greaterThan" value="849"/> 
      <Node id="14"> 
      <SimplePredicate field="WA.unity" operator="lessOrEqual" value="198.5991815"/> 
      <Node id="26" score="7.94"> 
       <SimplePredicate field="SP.3" operator="lessOrEqual" value="11.61334328"/> 
      </Node> 
      <Node id="27"> 
       <SimplePredicate field="SP.3" operator="greaterThan" value="11.61334328"/> 
       <Node id="36" score="8.75"> 
       <SimplePredicate field="MDEC.13" operator="lessOrEqual" value="6.9421166205"/> 
       </Node> 
       <Node id="37" score="8.42"> 
       <SimplePredicate field="MDEC.13" operator="greaterThan" value="6.9421166205"/> 
       </Node> 
      </Node> 
      </Node> 
      <Node id="15" score="9.408"> 
      <SimplePredicate field="WA.unity" operator="greaterThan" value="198.5991815"/> 
      </Node> 
      </Node> 
      </Node> 
     </Node> 
     </TreeModel> 
     </Segment> 
     <Segment id="3"> 
+0

尝试使用Google的'条件的XPath expression' – tom 2012-02-27 14:16:37

+0

这个问题是相当不确定的:1.“XML”提供的是不是一个良好的XML文档。没有人说什么应该是处理的结果。 ...请编辑问题并提供必要的信息以使其更有意义。如果不这样做,可能会导致意想不到的效果,对您无用。 – 2012-02-27 17:54:40

+0

这个想法是基于存储在XML文件中的决策树生成规则集(java源代码)。该文件太大,无法附加(接近90000行) – lochi 2012-02-28 02:35:56

回答

0

是这样的吗?

//node[@score] 
0

你已经试过了什么?这是你可以尝试什么:

  1. //Node[@id='16']/ancestor::Node
  2. 迭代让您的节点的祖先在那个节点列表,并创建规则集,当你阅读节点的属性
  3. 去年祖先时
  4. 得到最终的节点和检索比分是
  5. 打印你所

这里使用一个样本只有标准的JDK,但你可能会使用类似发现:

public class SO9466408 { 
    private static final Map<String, String> OP = new HashMap<String, String>() {{ put("lessOrEqual", "<="); }}; 

    public static String attrValue(Node node, String attrName) { 
     return node.getAttributes().getNamedItem(attrName).getTextContent(); 
    } 

    public static void main(String[] args) throws XPathExpressionException { 
     final String id = "16"; 
     String score = null; 
     final StringBuilder ruleset = new StringBuilder("if ("); 
     // XML/XPath 
     final InputSource xmlInput = new InputSource(new URL("your file.xml").openStream()); 
     final XPath xpath = XPathFactory.newInstance().newXPath(); 
     // get the ancestors node 
     final XPathExpression expr = xpath.compile("//Node[@id='" + id + "']/ancestor::Node"); 
     final NodeList ancestors = (NodeList) expr.evaluate(xmlInput, XPathConstants.NODESET); 

     for (int i = 0; i < ancestors.getLength(); ++i) { 
      Node predicate = ancestors.item(i).getFirstChild(); 
      // get a new rule 
      if (predicate.getNodeName().equals("SimplePredicate")) { 
       ruleset.append(String.format("%s(%s %s %s)", i > 1 ? " && " : "", 
         attrValue(predicate, "field"), OP.get(attrValue(predicate, "operator")), attrValue(predicate, "value"))); 
      } 
      // retrieve the score on the last node 
      if (i == ancestors.getLength() - 1) { 
       score = attrValue((Node) xpath.compile("//Node[@id='" + id + "']").evaluate(ancestors.item(i), XPathConstants.NODE), "score"); 
      } 
     } 
     // show what we found 
     ruleset.append(") {\n\tscore = " + score + ";\n}"); 
     System.out.println(ruleset.toString()); 
    } 
} 

// Outputs: 
// if ((GRAVH.1 <= 2751.5996775) && (WV.unity <= 93.567676535) && (Zagreb <= 74)) 
// { 
//  score = 2.32 
// } 
+0

亚历克斯,感谢您的答案。我会尝试你的方法,并让你知道它是怎么回事.. – lochi 2012-02-28 02:36:36