2010-10-21 3 views
1

Привет, у меня есть XSD, который я хочу разобрать. Обратите внимание, что я не хочу проверять его против XML, но получаю все перечисления, которые у меня есть. Напримерсинтаксический анализ XSD с 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> 

Я хочу извлечь значения перечисления .. любую идею? Я пытался играть с XSD :: Schema, но безуспешно ..

ответ

2

XSD - это просто аромат XML, поэтому вы можете использовать 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

да, я понял, несколько часов назад :-) –

+0

Примечания Есть некоторые проблемы с этим подходом: 1. Вы не закрыть файл должным образом 2. это сломается, как только появится другое перечисление, лучше используйте что-то вроде // xsd: simpleType [@ name = "fruitNames"] // xsd: enumeration –

2

Пример кода:

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>