estrutura xml Traverse para determinar se existe um certo nó de texto
-
13-09-2019 - |
Pergunta
Tudo bem, eu tenho um documento XML que é algo como isto:
<xml>
<list>
<partner>
<name>Some Name</name>
<status>active</status>
<id>0</id>
</partner>
<partner>
<name>Another Name</name>
<status>active</status>
<id>1</id>
</partner>
</list>
</xml>
Eu estou usando lib-xml do Ruby para analisá-lo. Quero descobrir se existe um parceiro com o nome 'Alguns Name' de uma forma rápida e rubi idiomática.
Como posso fazer isso em uma linha ou código de rubi, assumindo eu tenho um documento analisado em um documento variável chamada .. Tal que eu posso chamar document.find (XPath) para recuperar os nós. Eu tive que fazer isso várias vezes em um pouco diferentes cenários e agora está começando a me incomodar.
Eu sei que eu posso fazer o seguinte (mas seu feio)
found = false
document.find('//partner/name').each do |name|
if (name.content == 'Some Name')
found = true
break
end
end
assert(found, "Some Name should have been found")
mas eu acho isso muito feio. Pensei em usar a enumeração inclui? método mixin, mas que ainda não trabalho vai porque eu preciso para obter o campo .content de cada nó em oposição ao nó real ... Enquanto escrevia este, I embora isso (mas parece um tanto ineficiente embora elegante)
found = document.find('//partner/name').collect{|name| name.content}.member?("Some Name")
Existem outras maneiras de fazer isso?
Solução
O que sobre isso?
found = document.find("//partner[name='Some Name']").empty?
Outras dicas
Eu tentei esta solução:
found = document.find("//partner[name='Some Name']") != nil
mas eu tenho um erro dizendo a expressão XPath era inválido. No entanto, eu estava lendo alguma documentação xpath que parece que você pode chamar uma função text () na expressão para obter o nó de texto. Eu tentei o seguinte e parece trabalho:
found = document.find("//partner/name/text()='Some Name'")
encontrados na verdade não é um nó xml mas um verdadeiro / falso objeto para isso funciona.
Gostaria de usar uma linguagem que nativamente opera em XML (XQuery por exemplo). Com XQuery, é possível formular este tipo de consultas sobre dados XML de uma forma concisa e elegante.