当前位置: 首页 > 知识库问答 >
问题:

基于匹配子元素条件选择父元素的XPATH查询

卫君博
2023-03-14

我正在尝试解析下面的xml以根据某些条件获取ScId元素值。此条件在xpath字符串中提及,然后在xpath Next字符串中选择ScId值。

<?xml version="1.0" encoding="ISO-8859-1"?>
<SchoolData>
<School>
<ScId>SC101-91</ScId>
    <Location>
      <Branch>
        <BranchId>Br-111</BranchId>
        <Type>Residential</Type>
        <RealType>Residential</RealType>
      </Branch>
      <Branch>
        <BranchId>BR-222</BranchId>
        <Type>Daycare</Type>
        <RealType>Daycare</RealType>
      </Branch>
      <Branch>
        <BranchId>Br-333</BranchId>
        <Type>Unknown</Type>
        <RealType>Unknown</RealType>
      </Branch>
    </Location>
</School>

<School>
<ScId>RC101-92</ScId>
    <Location>
      <Branch>
        <BranchId>Br-111</BranchId>
        <Type>Residential</Type>
        <RealType>Residential</RealType>
      </Branch>
      <Branch>
        <BranchId>BR-222</BranchId>
        <Type>Daycare</Type>
        <RealType>Daycare</RealType>
      </Branch>
      <Branch>
        <BranchId>Br-333</BranchId>
        <Type>Unknown</Type>
        <RealType>Unknown</RealType>
      </Branch>
    </Location>
</School>
</SchoolData>

我使用VTD xml解析器使用嵌套的xpath查询来获取ScId值,该值以RC开头,类型=Daycare。

下面是代码

String xpath = "/*/School[starts-with(ScId,'RC')]/Location/Branch[Type='Daycare']";
        String xml = "/school.xml";
        
        final VTDGenHuge vg = new VTDGenHuge();
        System.out.println("Parsing");
        vg.parseFile(xml, true, VTDGenHuge.MEM_MAPPED);

        VTDNavHuge vn = vg.getNav();

        AutoPilotHuge aph = new AutoPilotHuge(vn);
        String xpathNext = "concat(//ScId,'-NEW')";
        aph.selectXPath(xpath);
        while ((aph.evalXPath()) != -1) {
            getparsedValue(vn,xpathNext);
            
        }

解析逻辑是

private static String getparsedValue(final VTDNavHuge vn, String xpath) throws NavException,

    XPathParseException, XPathEvalException, XPathParseExceptionHuge, XPathEvalExceptionHuge, NavExceptionHuge{

        String value = null;
        vn.push();
        
        AutoPilotHuge ap = new AutoPilotHuge(vn);
        ap.selectXPath(xpath);

        ap.bind(vn);
        value = ap.evalXPathToString();
        System.out.println("parsed value is " +value);
        vn.pop();
        return value;
    }

这是我的回报

解析值为SC101-91-new

虽然我期待它是

解析值为RC101-92-新

共有1个答案

李永寿
2023-03-14

也许这个XPath-1.0表达式对您有所帮助。我没有可用的Java来测试它。

/*/School[starts-with(ScId,'RC') and Location/Branch[Type='Daycare']]

这将迭代所有<代码>

 类似资料:
  • 问题内容: 以下HTML的Selenium xpath选择器将是什么: 我需要让Selenium IDE根据元素文本在列表中找到第二个项目。我以为可以解决问题,但显然没有。 问题答案: 我想这就是你要找的 而且更好

  • 对于以下 HTML,硒 xpath 选择器是什么: 我需要让Selenium IDE根据元素文本定位列表中的第二项。我认为可以做到,但显然不行。

  • 本文向大家介绍jQuery 选择元素的子元素,包括了jQuery 选择元素的子元素的使用技巧和注意事项,需要的朋友参考一下 示例 要选择元素的子代,可以使用children()方法。 更改元素所有子.parent元素的颜色: 该方法接受一个可选selector参数,该参数可用于过滤返回的元素。            

  • 我正在使用TestCafe选择器来选择元素。这是一个复杂的Custin Child嵌套场景。 下面是HTML以了解我上面提到的内容: 在图片中,我提到了和,它们是父元素(具有相同的DOM),有一个grand grand child,而另一棵树中相同父元素的grand grand child是。我需要,但需要链接,因为所有父节点都有相同的DOM。

  • 问题内容: 我有一个带有标头元素的,我在其中加载了项: 在这种情况下,整个情况必须可见。 但是,如果为空,则可以使用CSS 选择器隐藏整个容器,如下所示: 现在,我正在使用选择器隐藏,但是整个都需要隐藏。 我知道JavaScript可以实现,但是在这种情况下,我需要单独使用CSS来实现,但是我不确定这是否可行。 问题答案: 我能提供的最好的方法(请记住,CSS没有父选择器)是将HTML重新组织为以

  • 我有一个样式规则,当一个标记有两个类时,我想应用于它。在没有JavaScript的情况下,有什么方法可以执行此操作吗?换句话说: 只有在同时应用了和类时,我才要应用我的样式规则。