Java XPath поиск текста - PullRequest
       1

Java XPath поиск текста

0 голосов
/ 27 февраля 2012

Следующее является частью файла 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 голосов
/ 27 февраля 2012

Что ты уже пробовал? Вот что вы можете попробовать:

  1. Получите предков вашего узла с //Node[@id='16']/ancestor::Node
  2. Переберите этот NodeList и создайте набор правил, когда вы читаете атрибуты узлов
  3. когда последний предок получает последний узел и получает из него оценку
  4. распечатать то, что вы нашли

Вот пример, использующий только стандартный 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
// }
0 голосов
/ 27 февраля 2012

Как то так?

//node[@score]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...