首页 > 解决方案 > XPath 不选择嵌套匹配

问题描述

假设我有这个:

<el class="classname">
  ...
  <el class="classname">
  </el>
  ...
</el>
<el class="classname">
 ...
  <el class="classname">
    ...
    <el class="classname">
    </el>
    ...
  </el>
 ...
</el>

如果这个 XPath 应该是相对的(即如果我事先匹配其中一个,我可以添加相同的 XPath 并且它仍然可以工作,我能否只获得两个顶级(没有嵌套的))

标签: htmlxmlxpath

解决方案


Lets say your xml looks like this:

<root>
  <div>
    <div>
      <el class="classname" id="a1">
        <div>
          <el class="classname" id="a2">
            <div>
              <el class="classname" id="a3">
                <div>
                  <el class="classname" id="a4"/>
                </div>
              </el>
            </div>
          </el>
          <el class="classname" id="a5">
            <div>
              <el class="classname" id="a6">
                <div>
                  <el class="classname" id="a7"/>
                </div>
              </el>
            </div>
          </el>
        </div>
      </el>
    </div>
  </div>
  <el class="classname" id="a8">
    <div>
      <el class="classname" id="a9">
        <div>
          <el class="classname" id="a10">
            <div>
              <el class="classname" id="a11"/>
            </div>
          </el>
        </div>
      </el>
    </div>
  </el>
</root>

you can use the count on ancestor's to get the correct level. For the first level use XPath:

//el[@class='classname'][count(ancestor::el[@class='classname'])=0]

will only select el-elements with @id="a1" and @id="a8"

For the second level use this XPath:

//el[@class='classname'][count(ancestor::el[@class='classname'])=1]

This will select the @id="a2", @id="a5" and @id="a9"

For the third level use :

//el[@class='classname'][count(ancestor::el[@class='classname'])=2]

This will select the @id="a3", @id="a6" and @id="a10"


推荐阅读