2017-04-27 3 views
1

ich diesen Ruby-Code verwenden möchten XML-Datei mit 10 Terminals zu erzeugen:Iteration mit

module WriteXML 
def write_data_xml 

    builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml| 
    xml.genesis { 
    xml.terminals { 

/// create here some loop to iterate 
     xml.terminal { 
     xml.name "PPRO_Terminal" 
     xml.type "ppro" 
     xml.credentials { 
      xml.username 'user1' 
      xml.password 'passwd1' 
      xml.token '5e36e51de2dde626804a8772dc26238c4d722bbc' 
     } 
     }} 
//////// 
     } 
    end 
    puts builder.to_xml 
    file = File.new("credentials.xml", "w") 

    File.open('credentials.xml', 'w') do |file| 
    file << builder.to_xml 
    end 
end 
end 

Wie ich Iteration verwenden können, um Code zu speichern, wenn ich viele Terminals erstellen?

Antwort

1

Hängt davon ab, wo Sie die Daten behalten, die diese Terminals identifizieren, ist das in einer Tabelle? Dann könnten Sie so etwas wie dieses

def write_data_xml credential 

    builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml| 
    xml.genesis { 
    xml.terminals { 
    xml.terminal { 
    xml.name credential.name 
    xml.type credential.type 
    xml.credentials { 
     xml.username credential.username 
     xml.password credential.password 
     xml.token credential.token 
    } 
    }} 
    } 
    end 
    File.open("credentials.xml", "a+") { |file| file.write builder.to_xml} 
end 
end 

tun Angenommen, Sie verwenden Active könnten Sie dann

Credentials.each do |credential| 
    write_data_xml credential 
end 

Wenn keine Tabelle, könnten Sie ein Array von Strukturen verwenden, wo Sie die benötigten Daten zu sammeln.

EDIT auf Anfrage der OP, hier eine Version, die nicht die einzige Verantwortung Prinzip

def write_data_xml 

    builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml| 
    xml.genesis { 
    xml.terminals { 
     Credentials.each do |credential| 
     xml.terminal { 
     xml.name credential.name 
     xml.type credential.type 
     xml.credentials { 
     xml.username credential.username 
     xml.password credential.password 
     xml.token credential.token 
     } 
     end 
    }} 
    } 
    end 
    File.write("credentials.xml", builder.to_xml) 
end 
end 

EDIT2

hier ein Beispiel, wie diese, da es mit einer Reihe von Strukturen zu verwenden, folgt keine Datenbank ist noch

Credentials = [] 
Credential = Struct.new(:name, :type, :username, :password, :token) 
Credentials << Credential.new('PPRO_Terminal', 'ppro', 'user1', 'passwd1', '5e36e51de2dde626804a8772dc26238c4d722bbc') 
Credentials << Credential.new('PPRO_Terminal2', 'ppro', 'user2', 'passwd2', '...') 

p Credentials 
[#<struct Credential name="PPRO_Terminal", type="ppro", username="user1", password="passwd1", token="5e36e51de2dde626804a8772dc26238c4d722bbc">, #<struct Credential name="PPRO_Terminal2", type="ppro", username="user2", password="passwd2", token="...">] 

NB zumindest, erstellen Sie diese außerhalb des Verfahrens

+0

Ich habe den Beitrag aktualisiert. –

+0

@Peter, es ist besser, nicht alles in eine große Methode zu setzen (https://en.wikipedia.org/wiki/Single_responsibility_principle), selbst das Schreiben in die Datei wäre besser aus den Methoden heraus, die das Optimum einfach wieder zurückbringen würde XML-Zeichenfolge Jedenfalls, wenn es dir egal ist, kannst du meine Schleife an der Stelle einfügen, auf die du in deinem Schnitt hingewiesen hast. es ist auch nicht klar, ob Sie alle xml in einer Datei oder eine Datei für jedes Terminal wollen – peter

+0

Ich will alles in eine Datei. Können Sie Ihre Antwort aktualisieren, so dass ich mit einem Blick Terminals in Tag-Terminals erzeugen kann? –