2011-07-17 5 views
0

와 업로드는 내가 노코 기리와 임시 파일을 구문 분석을 수정하고 XSD 스키마에 대해 유효성을 검증하려고이 thread구문 분석 임시 파일 노코 기리

에 파일 업로드에 대한 코드를 찾았지만, 항상 false를 반환 .

는 또한 this site

my.xml

<?xml version="1.0" encoding="ISO-8859-1"?> 

<shiporder orderid="889923" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="my.xsd"> 
    <orderperson>John Smith</orderperson> 
<shipto> 
    <name>Ola Nordmann</name> 
    <address>Langgt 23</address> 
    <city>4000 Stavanger</city> 
    <country>Norway</country> 
</shipto> 
<item> 
    <title>Empire Burlesque</title> 
    <note>Special Edition</note> 
    <quantity>1</quantity> 
    <price>10.10</price> 
</item> 
<item> 
    <title>Hide your heart</title> 
    <quantity>1</quantity> 
    <price>9.90</price> 
</item> 
</shiporder> 

my.xsd

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:simpleType name="stringtype"> 
    <xs:restriction base="xs:string"/> 
</xs:simpleType> 

<xs:simpleType name="inttype"> 
    <xs:restriction base="xs:positiveInteger"/> 
</xs:simpleType> 

<xs:simpleType name="dectype"> 
    <xs:restriction base="xs:decimal"/> 
</xs:simpleType> 

<xs:simpleType name="orderidtype"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="[0-9]{6}"/> 
    </xs:restriction> 
</xs:simpleType> 

<xs:complexType name="shiptotype"> 
    <xs:sequence> 
    <xs:element name="name" type="stringtype"/> 
    <xs:element name="address" type="stringtype"/> 
    <xs:element name="city" type="stringtype"/> 
    <xs:element name="country" type="stringtype"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="itemtype"> 
    <xs:sequence> 
    <xs:element name="title" type="stringtype"/> 
    <xs:element name="note" type="stringtype" minOccurs="0"/> 
    <xs:element name="quantity" type="inttype"/> 
    <xs:element name="price" type="dectype"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="shipordertype"> 
    <xs:sequence> 
    <xs:element name="orderperson" type="stringtype"/> 
    <xs:element name="shipto" type="shiptotype"/> 
    <xs:element name="item" maxOccurs="unbounded" type="itemtype"/> 
    </xs:sequence> 
    <xs:attribute name="orderid" type="orderidtype" use="required"/> 
</xs:complexType> 

<xs:element name="shiporder" type="shipordertype"/> 

</xs:schema> 

config.ru

$LOAD_PATH.unshift(File.dirname(__FILE__)) 
require 'UserUpload' 

run UserUpload 

UserUpload에 GitHub의에 전체 프로젝트를 업로드했습니다. rb

#encoding utf-8 

require 'sinatra/base' 
require 'haml' 
require 'nokogiri' 

class UserUpload < Sinatra::Base 

    helpers do 
    def open_schema 
     @myschema = Nokogiri::XML::Schema(File.open('my.xsd')) 
    end 

    def check_file 
    @test = @myschema.valid? (@mytmp) 
    @atest = @myschema.validate (@mytmp) 
    end 

    end 

    get '/upload' do 
    haml :upload, :layout => false 
    end 

    post '/upload' do 
    unless params[:file] && 
      (tmpfile = params[:file][:tempfile]) && 
      (name = params[:file][:filename]) 
     @error = "No file selected" 
     return haml(:upload) 
    end 
    STDERR.puts "Uploading file, original name #{name.inspect}" 
    while blk = tmpfile.read(65536) 
     # read tempfile with nokogiri and validate against xsd schema 
     @mytmp = Nokogiri::XML(tmpfile) 
     open_schema 
     check_file 
     STDERR.puts blk.inspect 
    end 

    "#{@mytmp}" # returns <?xml version="1.0"?> 
    #{}"@test = #{@test} @atest = #{@atest}" # @test = false 
    end 

end 

xml 파일을 명령 줄에서 xsd 스키마와 비교하여 유효성 검사를 시도하면 문제없이 작동합니다.

xmlreader.rb (Ruby 스크립트 비시나) 내가 용액 발견

require 'nokogiri' 

doc = Nokogiri::XML(File.open('my.xml')) 
schema = Nokogiri::XML::Schema(File.open('my.xsd')) 
y = schema.valid? (doc) #returns false if invalid and true if valid 
x = schema.validate (doc) #returns a listing of errors 
puts "valid? #{y} errors: #{x}" 

답변

0

:

post '/upload' do 
    unless params[:file] && 
     (tmpfile = params[:file][:tempfile]) && 
     (name = params[:file][:filename]) 
    @error = "No file selected" 
    return haml(:upload) 
    end 
    STDERR.puts "Uploading file, original name #{name.inspect}" 
    @mytmp = Nokogiri::XML(tmpfile.read) 
    open_schema 
    check_file 
end