【问题标题】:how I put condition for two attribute in Xpath?如何在 Xpath 中设置两个属性的条件?
【发布时间】:2014-08-10 20:52:15
【问题描述】:

我怎样才能通过Xpath PointBrush 获得 PointLocation 的内容恰好是 x 和 y。 不是:我在 My java 中写 Xpath

我的 Xpath:

  NodeList brushNode="PointBrush/PointLocation[x['" + entity.getPointLocation().getX() + "'] | /y['" + entity.getPointLocation().getY() + "']]"

我的 XML:

       <PointBrush>
         <PointLocation>
            <x>36.473796987533674</x>
            <y>35.49325534870742</y>
         </PointLocation>
      </PointBrush>
      <PointBrush>

   <PointBrush>
         <PointLocation>
            <x>36.4723496987533674</x>
            <y>35.1234534870742</y>
         </PointLocation>
      </PointBrush>
      <PointBrush>

【问题讨论】:

  • 不会是“and y”而不是“| /y”吗?
  • 我觉得你还需要用到“文本”功能

标签: java xml xpath


【解决方案1】:

根据你的需要,你至少有两种不同的选择……

你可以使用类似...

//PointBrush/PointLocation[x[text()='...'] and y[text()='...']]

这将在文档中的任何位置返回PointBrush,该位置具有PointLocation,具有xy 节点,其文本内容与您指定的值匹配...

或者你可以使用类似...

//PointBrush/PointLocation[x[text()='...']] | //PointBrush/PointLocation[y[text()='...']]

这将返回包含PointLocation 的任何PointBrush,其中包含文本内容与x 值匹配的x 节点或具有文本上下文与y 值匹配的y 节点...

这是一个非常重要的区别,因为这将检查 x 和 y 节点,并将返回匹配任何一种情况的每个 PointLocation...

try {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document dom = db.parse(Test1.class.getResourceAsStream("/Test.xml"));
    XPath xpath = XPathFactory.newInstance().newXPath();

    // Find the "thing" node...
    XPathExpression pointBrushExpr = xpath.compile("//PointBrush/PointLocation[x[text()='36.473796987533674'] and y[text()='35.49325534870742']]");
    Node pointBrush = (Node) pointBrushExpr.evaluate(dom, XPathConstants.NODE);

    XPathExpression xExpr = xpath.compile("x");
    Node xNode = (Node) xExpr.evaluate(pointBrush, XPathConstants.NODE);
    XPathExpression yExpr = xpath.compile("y");
    Node yNode = (Node) yExpr.evaluate(pointBrush, XPathConstants.NODE);

    System.out.println(xNode.getTextContent() + " x " + yNode.getTextContent());

    XPathExpression checkExp = xpath.compile("//PointBrush/PointLocation[x[text()='36.473796987533674']] | //PointBrush/PointLocation[y[text()='35.49325534870742']]");
    NodeList check = (NodeList) checkExp.evaluate(dom, XPathConstants.NODESET);
    for (int index = 0; index < check.getLength(); index++) {
        Node node = check.item(index);
        xExpr = xpath.compile("x");
        xNode = (Node) xExpr.evaluate(node, XPathConstants.NODE);
        yExpr = xpath.compile("y");
        yNode = (Node) yExpr.evaluate(node, XPathConstants.NODE);

        System.out.println(xNode.getTextContent() + " x " + yNode.getTextContent());
    }

} catch (ParserConfigurationException | SAXException | IOException | XPathExpressionException exp) {
    exp.printStackTrace();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2019-04-15
    • 2015-01-11
    相关资源
    最近更新 更多