2010-10-21 74 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>