代码之家  ›  专栏  ›  技术社区  ›  VP.

用Ruby解析XSD

  •  1
  • VP.  · 技术社区  · 15 年前

    嗨,我有一个XSD要解析。请注意,我不希望根据XML验证它,而是获取我在那里拥有的所有枚举。例如

    <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 回复  |  直到 15 年前
        1
  •  2
  •   mikej heading_to_tahiti    15 年前

    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"]
    
        2
  •  2
  •   Robert Klemme    15 年前

    代码示例:

    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>
    
    推荐文章