خواندن از و نوشتن در فایل XML

سلام دوستان
بنده میخوام یک فایل XML با ساختار زیر با استفاده از REXML یا nokogiri ایجاد کنم و ازش بخونم.

<Persons>
  <Person name="John Smith">
    <Age>30</Age>
    <Gender>Male</Gender>
  </Person>
  <Person name="Mike Folly">
    <Age>25</Age>
    <Gender>Male</Gender>
  </Person>
  <Person name="Lisa Carter">
    <Age>22</Age>
    <Gender>Female</Gender>
  </Person>
</Persons>

تنها کدی رو که تونستم بنویسم واسه نوشتن در فایله اونم با استفاده از nokogiri

require 'nokogiri'

xml = File.open("D:\\Sample.xml", "w")

doc = Nokogiri::XML::Builder.new { |xml|
  
  xml.Persons do

     xml.Person do
        xml.Person["Name"] = "John Smith"
        xml.Age    "30"
        xml.Gender "Male"
     end
     
     xml.Person do
        xml.Person["Name"] = "Mike Folly"
        xml.Age    "25"
        xml.Gender "Male"
     end
     
     xml.Person do
        xml.Person["Name"] = "Lisa Carter"
        xml.Age    "22"
        xml.Gender "FeMale"
     end

  end
  
}

File.write(xml, doc.to_xml)

تازه روبی رو شروع کردم. ممنون میشم راهنمایی بفرمایید

الان مشکلتون چیه؟

مشکلم اینه که نوشتن رو بلدم و خوندن روبلد نیستم
من دقیقا معادل این دو کد زیر پایتون رو در روبی میخوام
نوشتن در فایل

import xml.dom.minidom

doc = xml.dom.minidom.Document()

doc.appendChild(doc.createComment("Sample XML Document"))

root = doc.createElement('Persons')
doc.appendChild(root)

Person = doc.createElement('Person')            
Person.setAttribute("name", "John Smith")       
root.appendChild(Person)                        
                                                                                                
Age = doc.createElement('Age')                  
Age.appendChild(doc.createTextNode('30'))       
Person.appendChild(Age)                         
                                                                                               
Gender = doc.createElement('Gender')            
Gender.appendChild(doc.createTextNode('Male'))  
Person.appendChild(Gender)                      

Person = doc.createElement('Person')            
Person.setAttribute("name", "Mike Folly")       
root.appendChild(Person)                        
                                                                                                
Age = doc.createElement('Age')                  
Age.appendChild(doc.createTextNode('25'))       
Person.appendChild(Age)                         
                                                                                                
Gender = doc.createElement('Gender')            
Gender.appendChild(doc.createTextNode('Male'))  
Person.appendChild(Gender)                      

Person = doc.createElement('Person')            
Person.setAttribute("name", "Lisa Carter")      
root.appendChild(Person)                        
                                                                                                
Age = doc.createElement('Age')                  
Age.appendChild(doc.createTextNode('22'))       
Person.appendChild(Age)                         
                                                                                                
Gender = doc.createElement('Gender')            
Gender.appendChild(doc.createTextNode('FeMale'))
Person.appendChild(Gender)                      

file = open("C:\\Sample.xml", "w+")
doc.writexml(file, "", "    ", "\n")
file.close()

خواندن از فایل

import xml.dom.minidom

doc = xml.dom.minidom.parse("C:\\Sample.xml")

Person = doc.getElementsByTagName("Person")
for node in Person:
        Name   = node.getAttribute("name")
        Age    = node.getElementsByTagName("Age")[0]
        Gender = node.getElementsByTagName("Gender")[0]

        print("Name  : ", Name)
        print("Age   : ", Age.firstChild.data)
        print("Gender: ", Gender.firstChild.data)
        print()

خب الان نوشتن در فایل XML رو خودم بالاخره با Nokogiri نوشتم
الان خواندن از فایل در Nokogiri و خواندن و نوشتن با استفاده از ReXML رو میخوام
میخوام طوری فایل XML رو بخونم که خروجی به صورت زیر باشه

Name  :  John Smith
Age   :  30
Gender:  Male

Name  :  Mike Folly
Age   :  25
Gender:  Male

Name  :  Lisa Carter
Age   :  22
Gender:  FeMale

ممنون بابت لطفتون
ولی اینا کمک آنچنانی به بنده نکردن، بنده مشکلم با خواندنه فایله اونم با استفاده از حلقه ها و متدهای nokogiri و Rexml

شاید بهترین روش نیست با خوندن documentation نوشتم


require 'nokogiri'
xml = '
<Persons>
  <Person name="John Smith">
    <Age>30</Age>
    <Gender>Male</Gender>
  </Person>
  <Person name="Mike Folly">
    <Age>25</Age>
    <Gender>Male</Gender>
  </Person>
  <Person name="Lisa Carter">
    <Age>22</Age>
    <Gender>Female</Gender>
  </Person>
</Persons>
'

input = Nokogiri::XML(xml)
input.xpath("//Person").each do |x| 
  puts "Name: " + x[:name] + " Age: " + x.css("Age").text + " Gender: " + x.css("Gender").text
end

1 Likes

بسیار ممنون بابت لطفتون
کمک خیییییییییلی بزرگی به بنده بود. خودم بقیشو پیگیری میکنم

2 Likes