如何使用Nokogiri删除按子节点值搜索的XML节点?

时间:2018-01-21 16:53:49

标签: ruby-on-rails xml ruby-on-rails-4 nokogiri

我需要使用Nokogiri Gem从以下XML中删除Imovel Node CodigoImovel == 6124-2

<?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代码位于xml_str变量中,我用此解析:

xml = Nokogiri::XML(xml_str)

此代码使用Nokogiri正确创建XML结构,但我不知道如何通过元素值查找以及如何删除它。

以前我在Imovel元素中有一个ID属性,如:

<Imovel id="6124-2">......</Imovel>

我正在使用此删除:

xml.css('#'+imovel_id).remove

它工作正常。但是,接收此XML的系统不允许在Imovel节点中使用额外的属性。

我感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

我用这段代码解决了这个问题:

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

XPATH允许按值搜索特定节点。此查询返回特定节点。然后工作是删除节点。

this question中接受的答案帮助我解决了问题。