使用 Nokogiri 解析子节点
Parsing sub nodes with Nokogiri
我正在尝试使用 Nokogiri 的 XPath 解析这个 XML 结构。
<root>
<resource id='1' name='name1>
<prices>
<price datefrom='2015-01-01' dateto='2015-05-31' price='3000' currency='EUR'></price>
<price datefrom='2015-06-01' dateto='2015-12-31' price='4000' currency='EUR' ></price>
</prices>
</resource>
<!-- many more resource nodes -->
<root>
我正在迭代每个资源,对于每个资源,我需要获取它的 <prices>
个元素:
resourcesParsed = Nokogiri::XML(resourcesXML)
resources = resourcesParsed.xpath("//resource")
for resource in resources do
id = resource["id"]
# insert in resources tables
# parsing resource prices
getPrices(resource)
end
...
def getPrices(resource)
prices = resource.xpath("//price")
@logger.debug "prices=" + prices.to_s
# do whatever
end
出于某种原因,当我尝试解析 //price
时,它不仅获取了资源中的 <price>
个节点,还获取了整个 XML 中的所有 <prices>
个节点] 文件。
如何只解析资源的 <price>
个节点?
我知道了。
而不是:
prices = resource.xpath("//price")
我应该搜索:
prices = resource.xpath(".//price")
指向当前节点。
我会这样写代码:
resources = doc.search('resource').map{ |resource|
[
resource['id'],
resource.search('price').map{ |price|
{
price: price['price'],
datefrom: price['datefrom'],
dateto: price['dateto'],
currency: price['currency']
}
}
]
}
此时resources
是一个哈希数组的数组,每个子数组是一个resource
及其嵌入的价格:
# => [["1",
# [{:price=>"3000",
# :datefrom=>"2015-01-01",
# :dateto=>"2015-05-31",
# :currency=>"EUR"},
# {:price=>"4000",
# :datefrom=>"2015-06-01",
# :dateto=>"2015-12-31",
# :currency=>"EUR"}]]]
如果它是子数组的散列,那么将其重用于查找或进一步处理会更容易一些,其中每个子数组都是 price
:
resources.to_h
# => {"1"=>
# [{:price=>"3000",
# :datefrom=>"2015-01-01",
# :dateto=>"2015-05-31",
# :currency=>"EUR"},
# {:price=>"4000",
# :datefrom=>"2015-06-01",
# :dateto=>"2015-12-31",
# :currency=>"EUR"}]}
我正在尝试使用 Nokogiri 的 XPath 解析这个 XML 结构。
<root>
<resource id='1' name='name1>
<prices>
<price datefrom='2015-01-01' dateto='2015-05-31' price='3000' currency='EUR'></price>
<price datefrom='2015-06-01' dateto='2015-12-31' price='4000' currency='EUR' ></price>
</prices>
</resource>
<!-- many more resource nodes -->
<root>
我正在迭代每个资源,对于每个资源,我需要获取它的 <prices>
个元素:
resourcesParsed = Nokogiri::XML(resourcesXML)
resources = resourcesParsed.xpath("//resource")
for resource in resources do
id = resource["id"]
# insert in resources tables
# parsing resource prices
getPrices(resource)
end
...
def getPrices(resource)
prices = resource.xpath("//price")
@logger.debug "prices=" + prices.to_s
# do whatever
end
出于某种原因,当我尝试解析 //price
时,它不仅获取了资源中的 <price>
个节点,还获取了整个 XML 中的所有 <prices>
个节点] 文件。
如何只解析资源的 <price>
个节点?
我知道了。
而不是:
prices = resource.xpath("//price")
我应该搜索:
prices = resource.xpath(".//price")
指向当前节点。
我会这样写代码:
resources = doc.search('resource').map{ |resource|
[
resource['id'],
resource.search('price').map{ |price|
{
price: price['price'],
datefrom: price['datefrom'],
dateto: price['dateto'],
currency: price['currency']
}
}
]
}
此时resources
是一个哈希数组的数组,每个子数组是一个resource
及其嵌入的价格:
# => [["1",
# [{:price=>"3000",
# :datefrom=>"2015-01-01",
# :dateto=>"2015-05-31",
# :currency=>"EUR"},
# {:price=>"4000",
# :datefrom=>"2015-06-01",
# :dateto=>"2015-12-31",
# :currency=>"EUR"}]]]
如果它是子数组的散列,那么将其重用于查找或进一步处理会更容易一些,其中每个子数组都是 price
:
resources.to_h
# => {"1"=>
# [{:price=>"3000",
# :datefrom=>"2015-01-01",
# :dateto=>"2015-05-31",
# :currency=>"EUR"},
# {:price=>"4000",
# :datefrom=>"2015-06-01",
# :dateto=>"2015-12-31",
# :currency=>"EUR"}]}