2017-03-09 1 views
0

je XML qui ressemble à ceci:Comment obtenir les parties d'un contenu nœuds/texte qui ne font pas partie d'un sous-nœud

<foo>my dog <bar>has</bar> <bar>fleas</bar> he gave <bar>to me</bar></foo> 

Quand je veux le content ou inner_text du noeud <foo> ils retour:

my dog has fleas he gave to me 

Comment puis-je obtenir ce contenu d'une manière qui "has fleas" et "to me" font partie de sous-noeuds, et "my dog " et " he gave " ne sont pas emballés dans des sous-tags , de préférence dans l'ordre?

Je suppose qu'il doit y avoir une façon de voir les parties du contenu/texte et sachez qu'il s'agit de root, ceci est sous, etc?

+0

Veuillez lire "[ask]" avec les pages liées et "[mcve]". Votre question n'est pas bien posée. Vous nous avez donné un peu de XML et ensuite ne nous montrez rien de ce que vous avez essayé: Nous avons besoin de l'exemple minimum de votre code qui montre le problème avec la sortie désirée. Je ne vote pas pour fermer, mais s'il vous plaît faites ces choses à l'avenir parce qu'elles nous aident à vous aider et aident les autres à chercher des solutions similaires. –

Répondre

0

Ceci est couvert à la fois dans la documentation de Nokogiri, et dans de nombreuses réponses à propos de Nokogiri ici sur Stack Overflow.

La documentation NodeSet dit:

inner_text ⇒ objet également connu sous le nom: texte

Obtenez le texte interne de tous les objets Node contenu

Alors que la documentation Node dit:

content ⇒ Objet (aussi: #text, #inner_text)

Renvoie le contenu de ce noeud.

Vous pouvez le voir en action:

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<foo>my dog <bar>has</bar> <bar>fleas</bar> he gave <bar>to me</bar></foo> 
EOT 

doc.at('foo').text # => "my dog has fleas he gave to me" 
doc.at('foo').children.map(&:text) # => ["my dog ", "has", " ", "fleas", " he gave ", "to me"] 

Notez la chaîne vide " ". C'est le résultat de l'espace entre

</bar> <bar> 

Alors que nous, les humains aiment penser que rien être, en XML et HTML, il est encore un nœud de texte, il apparaît lors de la marche à travers le children, depuis un nœud de texte est encore un enfant. Normalement, un sélecteur plus strict serait utilisé pour l'éviter, mais dans ce cas, il n'y a pas de bon moyen de le faire car les autres chaînes récupérées ont aussi des espaces parasites.Je ferais probablement quelque chose comme ceci:

doc.at('foo').children.map { |node| node.text.strip } 
# => ["my dog", "has", "", "fleas", "he gave", "to me"] 

ou:

doc.at('foo').children.map { |node| node.text.strip }.reject { |node| node.empty? } 
# => ["my dog", "has", "fleas", "he gave", "to me"] 

Ensuite, en utilisant join(' ') résultats dans:

doc.at('foo').children.map { |node| node.text.strip }.join(' ') 
# => "my dog has fleas he gave to me" 

ou:

doc.at('foo').children.map { |node| node.text.strip }.reject { |node| node.empty? }.join(' ') 
# => "my dog has fleas he gave to me" 

En ce qui concerne comme sachant quel est le root:

doc.root # => #<Nokogiri::XML::Element:0x3fecdc8a2434 name="foo" children=[#<Nokogiri::XML::Text:0x3fecdc8a7984 "my dog ">, #<Nokogiri::XML::Element:0x3fecdc8a795c name="bar" children=[#<Nokogiri::XML::Text:0x3fecdc8a72a4 "has">]>, #<Nokogiri::XML::Text:0x3fecdc8a7934 " ">, #<Nokogiri::XML::Element:0x3fecdc8a790c name="bar" children=[#<Nokogiri::XML::Text:0x3fecdc8a6e94 "fleas">]>, #<Nokogiri::XML::Text:0x3fecdc8a78e4 " he gave ">, #<Nokogiri::XML::Element:0x3fecdc8a78bc name="bar" children=[#<Nokogiri::XML::Text:0x3fecdc8a6a84 "to me">]>]> 
doc.root.name # => "foo" 
0

Utilisez Nokogiri pour analyser xml. Il vous permet d'analyser à partir d'un fichier ou d'une chaîne.

xml_doc = Nokogiri::XML("<foo>my dog <bar>has</bar> <bar>fleas</bar> he gave <bar>to me</bar></foo>") 

#to get text for <bar> elements 
xml_doc.xpath("//bar").text() 
=> "hasfleasto me" 

#to get text for parent element <foo> 
xml_doc.xpath('//foo/text()').text() 
=> "my dog he gave " 

Si vous voulez un autre format, travailler avec des tableaux:

xml_doc.xpath("//bar").map(&:text).join(' ') 
=> "has fleas to me" 
0

Je ne sais pas beaucoup sur l'environnement que vous travaillez, mais si vous avez accès à XPath, cela est tout simplement string(foo). La fonction string() renvoie la valeur de chaîne d'un nœud, qui est la concaténation de ses nœuds de texte descendant.