2017-03-22 1 views
2

Je suis en train d'ajouter un <EventRouter> élément dans le code XML suivant:Comment mettre à jour un NodeSet

<EventRouters> 
     <EventRouter id="Important Events to Log File" class="com.cyclonecommerce.events2.router.LogFileRouter" active="true"> 
      <Parameters file="../logs/%nodeName%_events.log" 
         rollOnStart="false" autoFlush="true" 
         maxFileSize="2M" maxBackupFiles="5"/> 
      <MetadataProcessorListRef ref="Messaging"/> 
      <EventFilterRef ref="Important"/> 
     </EventRouter> 
     <EventRouter id="Message Detail to Log File" class="com.cyclonecommerce.events2.router.LogFileRouter" active="false"> 
      <Parameters file="../logs/%nodeName%_message_detail.log" 
         rollOnStart="true" autoFlush="true" 
         maxFileSize="2M" maxBackupFiles="5"/> 
      <MetadataProcessorListRef ref="Messaging"/> 
      <EventFilterRef ref="Message Detail"/> 
     </EventRouter> 

</EventRouters> 

Je suis en mesure d'ajouter un nœud à un ensemble de nœuds, mais après avoir sauvé le XML que je ne reçois pas la version actualisée XML Je veux:

require 'nokogiri' 

if File.exist?('a.xml') 
    data = File.read("a.xml") 

end 
doc = Nokogiri::XML.parse data 
doc2=doc.xpath("//EventRouters/EventRouter") 

event_router = Nokogiri::XML::Node.new("EventRouter",doc) 
event_router['id'] = "some" 
param_node = Nokogiri::XML::Node.new("Parameters",doc) 
param_node.content = "some content" 
event_router << param_node 
doc2<< event_router 

File.open('test.xml', 'w') do |file| 
    file.print doc.to_xml 
end 
+0

Qu'est-ce 'session_node '? Veuillez lire "[mcve]". Votre code doit démontrer le problème que vous posez. –

+0

Veuillez réduire votre échantillon XML à la _bare minimum_ nécessaire pour démontrer ce que vous voulez. Tout ce qui va au-delà est distrait par la question. Sur la base de cela, montrez un exemple de ce que votre sortie devrait être. Stack Overflow est une référence en ligne et votre question est d'aider les autres à résoudre ce problème à l'avenir, afin que les questions claires et complètes soient importantes. –

+0

@theTinMan: correction du code – muski

Répondre

0

L'ajout de nouveaux nœuds est simple. L'idée de base est similaire à l'analyse XML ou HTML:

  1. Recherchez le nœud sur lequel vous souhaitez ajouter un nouveau contenu.
  2. Utilisez la méthode appropriée pour ajouter le contenu, soit au début des enfants du noeud, soit en tant que frère ou parent enveloppant le noeud. Ces méthodes sont dans the Node documentation.
  3. Vous avez terminé.

Nokogiri rend facile d'ajouter un nœud à l'aide d'une chaîne, qu'il va analyser et convertir à un nœud:

require 'nokogiri' 
doc = Nokogiri::XML('<xml><node/></xml>') 

node = doc.at('node') 
node.add_child('<foo>bar</foo>') 
doc.to_xml # => "<?xml version=\"1.0\"?>\n<xml>\n <node>\n <foo>bar</foo>\n </node>\n</xml>\n" 

Vous pouvez aller à la route plus de créer un nouveau nœud mais je trouve la construction une chaîne plus facile.

En utilisant votre code pour la base, voici comment je l'ai écrit:

require 'nokogiri' 

data = DATA.read 

doc = Nokogiri::XML.parse data 
doc.xpath("//EventRouters/EventRouter").each do |event_router| 
    event_router.add_next_sibling("<EventRouter id='some'><Parameters>some content</Parameters></EventRouter>") 
end 

puts doc.to_xml 

__END__ 
<EventRouters> 
    <EventRouter>original1</EventRouter> 
    <EventRouter>original2</EventRouter> 
</EventRouters> 

en cours qui se traduit par:

<?xml version="1.0"?> 
<EventRouters> 
    <EventRouter>original1</EventRouter><EventRouter id="some"><Parameters>some content</Parameters></EventRouter> 
    <EventRouter>original2</EventRouter><EventRouter id="some"><Parameters>some content</Parameters></EventRouter> 
</EventRouters> 

Vous essayez d'utiliser << pour ajouter à un NodeSet, ce qui ne va pas faire ce que vous pensez qu'il va:

doc = Nokogiri::XML.parse data 
ers = doc.search('EventRouter') 
ers << Nokogiri::XML::Node.new('<foo/>', doc) 

à Adjonction, qui est un NodeSet, ne sera pas appliquer le nouveau nœud à tous les éléments du jeu:

doc.to_xml # => "<?xml version=\"1.0\"?>\n<EventRouters>\n <EventRouter>original1</EventRouter>\n <EventRouter>original2</EventRouter>\n</EventRouters>\n" 

Au contraire, il ajoute à la fin du jeu:

ers.to_xml # => "<EventRouter>original1</EventRouter><EventRouter>original2</EventRouter><<foo/>/>" 
1

changement

doc2=doc.xpath("//EventRouters/EventRouter") 

Pour

doc2 = doc.at_xpath("//EventRouters") 

xpath renvoie un tableau. Vous pouvez utiliser at_xpath pour obtenir le premier élément. Débarrassez-vous également de /EventRouter, parce que je suppose que vous vouliez ajouter un autre élément 'EventRouter' à EventRouters

+0

Merci. Je vais essayer – muski