java xpath搜索文本

时间:2012-02-27 14:12:38

标签: java xpath

以下是XML文件的一部分。我需要找到所有与其相关的分数的节点,并且所有SimplePredicates都会导致每个分数生成一个规则集 例如:

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">

2 个答案:

答案 0 :(得分:0)

这样的东西?

//node[@score]

答案 1 :(得分:0)

你做过什么?这是你可以尝试的:

  1. 使用//Node[@id='16']/ancestor::Node
  2. 获取节点的祖先
  3. 在读取节点属性
  4. 时,迭代该NodeList并创建规则集
  5. 当最后一个祖先获得最终节点并从中检索分数时
  6. 打印您找到的内容
  7. 以下是仅使用标准jdk的示例,但您可能会尝试使用dom4j之类的内容:

    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
    // }