2010-10-21 65 views
1

嗨,我有一個我想解析的XSD。請注意,我不想用XML對其進行驗證,但可以獲得我在那裏的所有枚舉。例如用ruby解析XSD

<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

啊,我想通了幾個小時前:-) – 2010-10-21 19:59:53

+0

注意,有一些問題,這種方法: 1.你不關閉文件正確 2.只要有另一個枚舉,這個就會中斷,最好使用// xsd:simpleType [@ name =「fruitNames」] // xsd:enumeration – 2011-04-06 12:21:43

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>