我正在使用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"/>
答案 0 :(得分:1)
在XPath的开头加上一个点section.xpath(".//wp:docPr")
,使其相对于当前的上下文元素:
.//w:t[contains(., '#something#')]
你已经在第一个XPath的谓词中使用了相同的表达式概念(这个要清楚:brew doctor
),但在第二个XPath中忘了它。