2009-02-12 9 views
10

Czy istnieje sposób generowania klas Ruby (może nawet klas ActiveResource) z XSD, tak aby zawierały sposób na serializację klas do xml, które są ważne dla początkowego XSD?Generowanie klas Rubinowych z XSD

Wiem, że soap4r ma xsd2ruby, ale wydaje się, że wygenerowane klasy ruby ​​nie mogą być łatwo serializowane do xml.

+0

Istnieje sposób serializowania obiektów klasy activerecord do xml. Ale nie sądzę, że szukasz czegoś podobnego. – Chirantan

Odpowiedz

3

Wygląda na to, że to może działać.

require 'xsd/mapowanie' XSD :: Mapping.obj2xml (xsdBasedObject)

5

Shameless autopromocji (nadzieję, że to jest w porządku na stackoverflow), ale pracuję nad projektem open source, aby zrobić tylko that

Jest to wciąż praca w toku (prosimy o wysyłanie łatek), ale ostatecznym celem jest przekonwertowanie XSD do/z klas Ruby (co robi teraz) i przekonwertowanie XML zgodny z tym XSD do/z wystąpień tych klas.

5

Mark

Mimo to został poproszony jakiś czas temu natknąłem się na rozwiązania i że może to pomóc ludzie w przyszłości.

Moja potrzeba była podobna. Mam plik .xsd od kolegi i chciałbym wygenerować z niego plik klasy. Mam nadzieję, że będę w stanie w prosty sposób przeprowadzić akcję i przekazać obiekt do jego punktu końcowego, gdzie jego serwer Java roześle ładunek i dynamicznie zbuduje obiekt po jego stronie bez dodatkowego wysiłku.

Rozwiązaniem, które znalazłem, było pobranie soap4r z https://github.com/rubyjedi/soap4r. Zrobiłem dwa pliki * .rb w pliku wykonywalnego bin a następnie prowadził:

bin/xsd2ruby.rb --xsd <source>.xsd --classdef <filename_prefix> 

Ten wygenerowany nowy plik z każdym z xsd:complexType realizowanego jako klasa. Wszystkie inne typy złożone zostały również wygenerowane z prawidłowymi relacjami dziedziczenia, a wszystkie xsd:element zdefiniowano jako zmienną instancji i zdefiniowano również inicjator klasy.

Running xsd2ruby.rb sama dała opcje:

~/src/test/soap4r:bin/xsd2ruby.rb 
Usage: bin/xsd2ruby.rb --xsd xsd_location [options] 
    xsd_location: filename or URL 

Example: 
    bin/xsd2ruby.rb --xsd myapp.xsd --classdef foo 

Options: 
    --xsd xsd_location 
    --classdef [filenameprefix] 
    --mapping_registry 
    --mapper 
    --module_path [Module::Path::Name] 
    --force 
    --quiet 

w trosce o kompletność, I przedłużony mój klasy z następujących (jest to klasa "Prospect"):

class Prospect 
    include Enumerable 
    def each(&block) 
    self.instance_variables.collect{|v| (v.gsub /@/, '').to_sym }.each(&block) 
    end 
end 

ten pozwól mi wykorzystać go jako treść żądania Net::HTTP::Post.

Na pytanie o darmowe to_xml: Nie znalazłem tego. Rubinowy obiekt jest dostarczany wraz z to_yaml i to_json po wyjęciu z pudełka, ale nie znalazłem żadnej prostej konwersji do XML. Tak więc doszło do rzucenia własnego "to_xml".

Mam nadzieję, że to pomoże.