XPath结果似乎秘密地拥有更多数据

时间:2016-01-08 22:20:01

标签: ruby xml xpath nokogiri

我正在使用Nokogiri解析XML文档并搜索特定部分并将其分配给变量。然后,我搜索该节点,结果似乎来自整个文档,而不是那个小部分。

示例:

data = Nokogiri::XML(File.open("something.xml"))
section = data.xpath("//w:tr[.//w:t[contains(., '#something#')]]").
section.xpath("//wp:docPr")

但是,XPath on部分返回的结果即使在puts section的输出中也是如此。

<w:tr w:rsidR="00B76A6E">
        <w:tc>
          <w:tcPr>
            <w:tcW w:w="9035" w:type="dxa"/>
            <w:tcBorders>
              <w:top w:val="single" w:sz="6" w:space="0" w:color="0A57A4"/>
            </w:tcBorders>
            <w:vAlign w:val="center"/>
          </w:tcPr>
          <w:p w:rsidR="00B76A6E" w:rsidRDefault="00D85F67">
            <w:pPr>
              <w:jc w:val="left"/>
            </w:pPr>
            <w:r>
              <w:t>#something#</w:t>
            </w:r>
          </w:p>
        </w:tc>
        <w:tc>
          <w:tcPr>
            <w:tcW w:w="1705" w:type="dxa"/>
            <w:tcBorders>
              <w:top w:val="single" w:sz="6" w:space="0" w:color="0A57A4"/>
            </w:tcBorders>
            <w:vAlign w:val="center"/>
          </w:tcPr>
          <w:p w:rsidR="00B76A6E" w:rsidRDefault="00D85F67">
            <w:r>
              <w:rPr>
                <w:noProof/>
              </w:rPr>
              <w:drawing>
                <wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="79A6C53C" wp14:editId="0DE97A9F">
                  <wp:extent cx="292608" cy="292608"/>
                  <wp:effectExtent l="0" t="0" r="0" b="0"/>
                  <wp:docPr id="924" name="Picture 924"/>
                  <wp:cNvGraphicFramePr>
                    <a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1"/>
                  </wp:cNvGraphicFramePr>
                  <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
                    <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
                      <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
                        <pic:nvPicPr>
                          <pic:cNvPr id="0" name="S-sm.png"/>
                          <pic:cNvPicPr/>
                        </pic:nvPicPr>
                        <pic:blipFill>
                          <a:blip r:embed="rId20" cstate="print">
                            <a:extLst>
                              <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
                                <a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0"/>
                              </a:ext>
                            </a:extLst>
                          </a:blip>
                          <a:stretch>
                            <a:fillRect/>
                          </a:stretch>
                        </pic:blipFill>
                        <pic:spPr>
                          <a:xfrm>
                            <a:off x="0" y="0"/>
                            <a:ext cx="292608" cy="292608"/>
                          </a:xfrm>
                          <a:prstGeom prst="rect">
                            <a:avLst/>
                          </a:prstGeom>
                        </pic:spPr>
                      </pic:pic>
                    </a:graphicData>
                  </a:graphic>
                </wp:inline>
              </w:drawing>
            </w:r>
          </w:p>
        </w:tc>
      </w:tr>

这非常令人困惑。我尝试在id标记中获取<wp:DocPr>的值,但它会返回很多这样的内容:

section.xpath("//wp:docPro")
<wp:docPr id="225" name="Picture 225"/>
<wp:docPr id="226" name="Picture 226"/>
<wp:docPr id="227" name="Picture 227"/>
<wp:docPr id="228" name="Picture 228"/>
<wp:docPr id="924" name="Picture 924"/>
<wp:docPr id="926" name="Picture 926"/>
<wp:docPr id="925" name="Picture 925"/>
<wp:docPr id="927" name="Picture 927"/>
<wp:docPr id="229" name="Picture 229"/>
<wp:docPr id="230" name="Picture 230"/>
<wp:docPr id="346" name="Picture 6"/>
<wp:docPr id="17" name="Picture 6"/>
<wp:docPr id="3" name="Picture 6"/>
<wp:docPr id="7" name="Picture 6"/>
<wp:docPr id="255" name="Picture 6"/>
<wp:docPr id="304" name="Picture 6"/>
<wp:docPr id="313" name="Picture 6"/>

1 个答案:

答案 0 :(得分:1)

在XPath的开头加上一个点section.xpath(".//wp:docPr") ,使其相对于当前的上下文元素:

.//w:t[contains(., '#something#')]

你已经在第一个XPath的谓词中使用了相同的表达式概念(这个要清楚:brew doctor),但在第二个XPath中忘了它。