首页 > 解决方案 > 如何使用 Nokogiri 按子节点值搜索 XML 节点的值?

问题描述

我需要CodigoImovel == 6124-2使用 Nokogiri Gem 从以下 XML 中获取值。

<?xml version="1.0" encoding="UTF-8"?>
<Carga xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Imoveis>
        <Imovel>
            <CodigoImovel>6124-2</CodigoImovel>
            <TipoImovel>Apartamento</TipoImovel>
            <SubTipoImovel>Apartamento Padrão</SubTipoImovel>
        </Imovel>
        <Imovel>
            <CodigoImovel>86765</CodigoImovel>
            <TipoImovel>Apartamento</TipoImovel>
            <SubTipoImovel>Apartamento Padrão</SubTipoImovel>
            <CategoriaImovel>Cobertura</CategoriaImovel>
        </Imovel>
        <Imovel>
            <CodigoImovel>981768</CodigoImovel>
            <TipoImovel>Casa</TipoImovel>
            <SubTipoImovel>Casa de Condomínio</SubTipoImovel>
            <CategoriaImovel>Térrea</CategoriaImovel>
        </Imovel>
        <Imovel>
            <CodigoImovel>357468</CodigoImovel>
            <TipoImovel>Casa</TipoImovel>
            <SubTipoImovel>Casa de Condomínio</SubTipoImovel>
            <CategoriaImovel>Térrea</CategoriaImovel>
        </Imovel>
        <Imovel>
            <CodigoImovel>587168</CodigoImovel>
            <TipoImovel>Comercial/Industrial</TipoImovel>
            <SubTipoImovel>Conjunto</SubTipoImovel>
            <CategoriaImovel>Comercial/Sala Padrão</CategoriaImovel>
        </Imovel>
    </Imoveis>
</Carga>

我正在使用它来获取值 xml.xpath("//Carga//Imoveis//Imovel[CodigoImovel='"+re_code+"']") 但它表示未定义的局部变量或方法 `re_code' for # 我感谢任何帮助. 谢谢!

标签: ruby-on-railsxmlnokogiri

解决方案


我做了以下事情,最终可以得到你需要的节点:

 require 'nokogiri'
 xml = Nokogiri::XML::Document.parse '<Carga 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Imoveis>
      <Imovel>
          <CodigoImovel>6124-2</CodigoImovel>
          <TipoImovel>Apartamento</TipoImovel>
          <SubTipoImovel>Apartamento Padrão</SubTipoImovel>
      </Imovel>
      <Imovel>
          <CodigoImovel>86765</CodigoImovel>
          <TipoImovel>Apartamento</TipoImovel>
          <SubTipoImovel>Apartamento Padrão</SubTipoImovel>
          <CategoriaImovel>Cobertura</CategoriaImovel>
      </Imovel>
      <Imovel>
          <CodigoImovel>981768</CodigoImovel>
          <TipoImovel>Casa</TipoImovel>
          <SubTipoImovel>Casa de Condomínio</SubTipoImovel>
          <CategoriaImovel>Térrea</CategoriaImovel>
      </Imovel>
      <Imovel>
          <CodigoImovel>357468</CodigoImovel>
          <TipoImovel>Casa</TipoImovel>
          <SubTipoImovel>Casa de Condomínio</SubTipoImovel>
          <CategoriaImovel>Térrea</CategoriaImovel>
      </Imovel>
      <Imovel>
          <CodigoImovel>587168</CodigoImovel>
          <TipoImovel>Comercial/Industrial</TipoImovel>
          <SubTipoImovel>Conjunto</SubTipoImovel>
          <CategoriaImovel>Comercial/Sala Padrão</CategoriaImovel>
      </Imovel>
  </Imoveis>
</Carga>' 

在解析后和最后注意单引号。然后我做了这个

re_code = '6124-2'
xml.xpath("//Carga//Imoveis//Imovel[CodigoImovel='"+re_code+"']")

并获得第一个<Imovel>带有子节点的节点作为回报。虽然我不知道你为什么叫它re_code,但你的意思是在这里使用正则表达式吗?


推荐阅读