【问题标题】:How to get node text from child context using ruby, xpath, rexml如何使用 ruby​​、xpath、rexml 从子上下文中获取节点文本
【发布时间】:2015-09-17 21:01:59
【问题描述】:

我在获取 REXML::XPath.first 以从子上下文呈现正确的节点文本时遇到问题。

请参阅下面的测试脚本和 xml。

test.rb

require 'rexml/document'
require 'rexml/xpath'

file = File.new('test.xml')
doc = REXML::Document.new(file)

employers = REXML::XPath.match(doc, '//EmployerOrg')
employers.each do |employer|
  # this looks fine, position_history is being set for each employer
  position_history = REXML::XPath.first(employer, 'PositionHistory')

  # always returns the title from the first employer, in spite of the position_history context
  p title = REXML::XPath.first(position_history, '//Title').text
end

输出:

"Director of Web Applications Development"
"Director of Web Applications Development"
"Director of Web Applications Development"

示例 XML:

<?xml version="1.0" encoding="UTF-8"?>
<Resume xml:lang="en" xmlns="http://ns.hr-xml.org/2006-02-28" xmlns:sov="http://sovren.com/hr-xml/2006-02-28">
  <StructuredXMLResume>
    <EmploymentHistory>
      <EmployerOrg>
        <EmployerOrgName>Technical Difference</EmployerOrgName>
        <PositionHistory positionType="directHire" currentEmployer="true">
          <Title>Director of Web Applications Development</Title>
          <OrgName>
            <OrganizationName>Technical Difference</OrganizationName>
          </OrgName>
          <StartDate>
            <AnyDate>2004-10-01</AnyDate>
          </StartDate>
          <EndDate>
            <AnyDate>2015-09-15</AnyDate>
          </EndDate>
        </PositionHistory>
      </EmployerOrg>
      <EmployerOrg>
        <EmployerOrgName>Convergence Inc. LLC</EmployerOrgName>
        <PositionHistory positionType="directHire">
          <Title>Senior Web Developer/DBA</Title>
          <OrgName>
            <OrganizationName>Convergence Inc. LLC</OrganizationName>
          </OrgName>
          <StartDate>
            <AnyDate>2003-03-01</AnyDate>
          </StartDate>
          <EndDate>
            <AnyDate>2004-12-01</AnyDate>
          </EndDate>
          <UserArea>
            <sov:PositionHistoryUserArea>
              <sov:Id>POS-2</sov:Id>
              <sov:CompanyNameProbability>23</sov:CompanyNameProbability>
              <sov:PositionTitleProbability>30</sov:PositionTitleProbability>
            </sov:PositionHistoryUserArea>
          </UserArea>
        </PositionHistory>
      </EmployerOrg>
      <EmployerOrg>
        <EmployerOrgName>Avalon Digital Marketing Systems, Inc</EmployerOrgName>
        <PositionHistory positionType="contract">
          <Title>Contractor - Web Development</Title>
          <OrgName>
            <OrganizationName>Avalon Digital Marketing Systems, Inc</OrganizationName>
          </OrgName>
          <StartDate>
            <AnyDate>2002-05-01</AnyDate>
          </StartDate>
          <EndDate>
            <AnyDate>2003-03-01</AnyDate>
          </EndDate>
        </PositionHistory>
        <PositionHistory positionType="directHire">
          <Title>Web Developer/Junior DBA</Title>
          <OrgName>
            <OrganizationName>European Division</OrganizationName>
          </OrgName>
          <StartDate>
            <AnyDate>2000-05-01</AnyDate>
          </StartDate>
          <EndDate>
            <AnyDate>2002-04-30</AnyDate>
          </EndDate>
        </PositionHistory>
      </EmployerOrg>
    </EmploymentHistory>
  </StructuredXMLResume>
</Resume>

【问题讨论】:

  • 不要使用 REXML,而是使用 Nokogiri,这是使用 Ruby 解析 XML/HTML 的事实标准,并且使用其 Builder API 有一个很好的生成器。
  • 事实上的标准? REXML 在标准库中,我想避免添加新的依赖项。
  • @theTinMan,我认为你在受欢迎程度方面是正确的,所以可以作为判断受欢迎程度的粗略指南(120 q,REXML 有 2 个追随者,2557 q。Nokogiri 有 135 个追随者)。虽然建议另一种工具来完成这项工作并不总是一个合适的答案......
  • 帮助的部分任务是推荐改进和更好的做事方法。简单地回答手头的问题通常会导致糟糕的代码运行不佳,而不是代码清晰、干净且可维护。 REXML 与 Ruby 捆绑在一起,但这并不意味着它是最快的、最健壮的或文档齐全的。这是历史性的产品,但多年来其他软件包已被替换,因此它也可能以这种方式结束。

标签: ruby xml xpath rexml


【解决方案1】:

可能是因为您的 XPath '//Title' 说从文档顶部开始,几乎忽略了上下文节点 position_history。尝试将其替换为 './Title' 或只是 'Title'

【讨论】:

  • 'Title''./Title' 都有效。谢谢!想知道为什么// 从文档顶部开始而不是我传入的上下文会很有趣。这让我感到困惑。
  • 因为文档只被解析一次,并且函数正在返回您应该考虑的指向该已解析文档中节点的指针或指针集。您可以像在命令提示符下考虑当前工作目录一样考虑它。如果我说(Unix 格式)ls /,无论我在文件系统树的哪个位置,它都会列出根目录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 2023-03-27
  • 2012-12-30
  • 1970-01-01
  • 2014-12-25
相关资源
最近更新 更多