ruby - XPath 选择 OOXML 中两个文本标记之间的所有节点?

标签 ruby xml xpath nokogiri openxml

我有一个大的 XML 文件(来自 Microsoft Word),其中包含表格、段落等。我试图获取两个元素之间的所有 XML。例如,我想获取这两者之间的所有 XML

<w:p w:rsidR="00C82C88" w:rsidRDefault="00265695">
  <w:r>
    <w:t>#StartHere#</w:t>
  </w:r>
</w:p>
  a whole bunch of XML
<w:p w:rsidR="00C82C88" w:rsidRDefault="00265695" w:rsidP="00265695">
  <w:pPr>
    <w:pStyle w:val="Caption"/>
  </w:pPr>
  <w:r>
    <w:t xml:space="preserve">Figure </w:t>
  </w:r>
  <w:r w:rsidR="00F044F8">
    <w:fldChar w:fldCharType="begin"/>
  </w:r>
  <w:r w:rsidR="00F044F8">
    <w:instrText xml:space="preserve"> SEQ Figure \* ARABIC </w:instrText>
  </w:r>
  <w:r w:rsidR="00F044F8">
    <w:fldChar w:fldCharType="separate"/>
  </w:r>
  <w:r>
    <w:rPr>
      <w:noProof/>
    </w:rPr>
    <w:t>1</w:t>
  </w:r>
  <w:r w:rsidR="00F044F8">
    <w:rPr>
      <w:noProof/>
    </w:rPr>
    <w:fldChar w:fldCharType="end"/>
  </w:r>
  <w:r>
    <w:t>: #StopHere#</w:t>
  </w:r>
</w:p>

如何让 Nokogiri 获取 #StartHere# 和 #StopHere# 之间的所有 XML,包括包含此文本的那些元素?我想以某种方式调用类似 extracted_data = document[from..stop] 的内容。

我可以通过查找以下内容在文档中找到这些要点:

start = doc.at_xpath("//w:p[.//w:t[contains(., '#StartHere#')]]")
stop = doc.at_xpath("//w:p[.//w:t[contains(., '#StopHere#')]]")

但需要弄清楚如何说 document[start..stop] 来抓取所有内容(包括那些)及其之间的内容。

最佳答案

此 XPath

//node()[    preceding::w:p[w:r/w:t[.='#StartHere#']] 
         and following::w:p[w:r/w:t[.=': #StopHere#']]]

将选择包含标记文本的两个段落之间的所有节点。

在 Nokogiri 中:doc.xpath("在此处插入 XPath 上方")

关于ruby - XPath 选择 OOXML 中两个文本标记之间的所有节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40410269/

相关文章:

java - 如何更改android抽屉导航中所选项目的背景颜色?

C# - 解析网页的最佳方法?

selenium - 为什么我应该使用 CSS 选择器而不是 XPath 进行自动化测试?

xml - 如何使用 XmlStarlet 将具有属性的元素插入到 XML 文件中?

ruby-on-rails - 来自 omniauth 的双重请求(设计、自定义策略、oauth2)

ruby - 编码::UndefinedConversionError:U+00A0 从 UTF-8 到 US-ASCII

c# - 在 asp.net 中使用带项目符号列表的 xml

xpath - Scrapy - 从表中提取项目

ruby-on-rails - Rails 将多个表导出到 csv

ruby - 将排序的 Ruby 数组转换为具有可能重复的排名