2010-10-21 10 views
1

Salut j'ai un XSD que je veux analyser. Notez que je ne veux pas le valider par rapport à un XML mais obtenir toutes les énumérations que j'ai ici. Par exempleanalyser XSD avec ruby ​​

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<xsd:simpleType name="fruitNames"> 
    <xsd:restriction base="xsd:string"> 
    <xsd:enumeration value="banana" /> 
    <xsd:enumeration value="apple" /> 
    <xsd:enumeration value="orange" /> 
    <xsd:enumeration value="mango" /> 
</xsd:restriction> 
</xsd:simpleType> 
</xsd:schema> 

Je veux extraire les valeurs d'énumération .. une idée? J'ai essayé de jouer avec XSD :: Schema mais sans succès ..

Répondre

2

XSD est juste un goût de XML de sorte que vous pouvez utiliser par exemple REXML

require 'rexml/document' 
doc = REXML::Document.new(File.new('yourfile.xsd')) 
values = doc.elements.to_a('//xsd:enumeration').map { |el| el.attributes['value'] } 
=> ["banana", "apple", "orange", "mango"] 
+0

yup, je me suis quelques heures il y a :-) –

+0

note il y a quelques problèmes avec cette approche: 1. Vous ne fermez pas le fichier correctement 2. cela se casse dès qu'il y a une autre énumération, mieux vaut utiliser quelque chose comme // xsd: simpleType [@ name = "fruitNames"] // xsd: énumération –

2

Exemple de code:

require 'rexml/document' 

doc = REXML::Document.new(DATA.read) 

REXML::XPath.each(doc, '//xsd:simpleType[@name="fruitNames"]//xsd:enumeration/@value') do |e| 
    puts e.value 
end 

__END__ 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<xsd:simpleType name="fruitNames"> 
    <xsd:restriction base="xsd:string"> 
    <xsd:enumeration value="banana" /> 
    <xsd:enumeration value="apple" /> 
    <xsd:enumeration value="orange" /> 
    <xsd:enumeration value="mango" /> 
</xsd:restriction> 
</xsd:simpleType> 
</xsd:schema>