2017-01-23 1 views
0

I XML-Datei mit KopfNokogiri Gem analysieren pflegt die Datei SAX-Handler

<?xml version="1.0" encoding="utf-16"?> 

und enthält auch sie die

<transmission xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

haben, wenn der SAX-Parser verwendet, es wird nicht analysieren. Aber wenn manuell entfernt den Codierungsteil und die Attribute nach der Übertragung, XML-Parsing-Erfolg. Da die Datei groß ist, kann ich nur SAX verwenden. Gibt es eine andere Möglichkeit, diese XML-Datei zu analysieren, ohne die Kodierungs- und Übertragungsattribute manuell zu entfernen.

Beispielcode ist

 require 'nokogiri' 
     include Nokogiri 



class P < Nokogiri::XML::SAX::Document 

     def initialize 
     end 

     def start_element(element, attributes = []) 
     puts element 
     end 

     def cdata_block(string) 
     end 

     def characters(string) 
     end 

     def end_element(element) 
     puts element 
     end 
end 

    parser = Nokogiri::XML::SAX::Parser.new(P.new()) 
    parser.parse_file('file_dummy.xml') 
+0

Es ist es wichtig, den SAX-Parser zu verwenden? Vielleicht ist es ein Fehler in dieser Bibliothek. – tadman

+0

@tadman Es ist eine große Datei, nur die Option verwendet nur den SAX-Parser. –

+1

Es könnte sich lohnen, ein wenig Code zu geben, der erklärt, wie Sie dies mit Nokogiri tun. Im Moment scheint es ein Fehler in SAX zu sein, aber es könnte ein Problem sein, wie Nokogiri damit umgehen kann. – tadman

Antwort

0

Nach zahlreichen Empfehlungen. Ich habe die Antwort bekommen. Es ist die Antwort von @ thetinman.Aber nicht vollständig absorbiert. Verwendete einen sed-Befehl, um utf-16 durch utf-8 zu ersetzen und die Datei zu analysieren. Warum brauche ich die Sed-Operation ist Nokogiri verursacht Problem mit dieser UTF-16

0

Versuchen Sie, die Suite von SAX-Methoden implementiert werden und sehen, was Sie bekommen:

require 'nokogiri' 

class MyDoc < Nokogiri::XML::SAX::Document 
    def cdata_block(str) 
    puts "cdata_block: #{str}" 
    end 

    def characters(str) 
    puts "characters: #{str}" 
    end 

    def comment(str) 
    puts "comment: #{str}" 
    end 

    def end_element(str) 
    puts "end_element: #{str}" 
    end 

    def end_document 
    puts "end_document" 
    end 

    def end_element_namespace(name, prefix = nil, uri = nil) 
    puts "end_element_namespace: name: #{name} prefix: #{prefix} uri: #{uri}" 
    end 

    def error(str) 
    puts "error:#{str}" 
    end 

    def processing_instruction(name, content) 
    puts "processing_instruction: name: #{name} content: #{content}" 
    end 

    def start_document 
    puts "start_document" 
    end 

    def start_element(str, attrs = []) 
    puts "start_element: #{str} attrs: #{attrs}" 
    end 

    def start_element_namespace(name, attrs=[], prefix=nil, uri=nil, ns=[]) 
    puts "start_element_namespace: name: #{name} attrs: #{attrs} prefix: #{prefix} uri: #{uri} ns: #{ns}" 
    end 

    def warning(str) 
    puts "warning: #{str}" 
    end 

    def xmldecl(version, encoding, standalone) 
    puts "xmldecl: version: #{version} encoding: #{encoding} standalone: #{standalone}" 
    end 
end 

parser = Nokogiri::XML::SAX::Parser.new(MyDoc.new) 
parser.parse(File.open(ARGV[0])) 

speichern, die ein Skript und führen Sie es mit:

ruby path/to/script.rb path/to/file.xml 

Sie sollten die Ausgabe sehen. Zum Beispiel mit dem folgenden als eine einfachen XML-Datei:

<?xml version="1.0"?> 
<catalog> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
    </book> 
</catalog> 

bekomme ich folgende Ausgabe:

xmldecl: version: 1.0 encoding: standalone: 
start_document 
start_element_namespace: name: catalog attrs: [] prefix: uri: ns: [] 
characters: 

start_element_namespace: name: book attrs: [#<struct Nokogiri::XML::SAX::Parser::Attribute localname="id", prefix=nil, uri=nil, value="bk101">] prefix: uri: ns: [] 
characters: 

start_element_namespace: name: author attrs: [] prefix: uri: ns: [] 
characters: Gambardella, Matthew 
end_element_namespace: name: author prefix: uri: 
characters: 

start_element_namespace: name: title attrs: [] prefix: uri: ns: [] 
characters: XML Developer's Guide 
end_element_namespace: name: title prefix: uri: 
characters: 

start_element_namespace: name: genre attrs: [] prefix: uri: ns: [] 
characters: Computer 
end_element_namespace: name: genre prefix: uri: 
characters: 

start_element_namespace: name: price attrs: [] prefix: uri: ns: [] 
characters: 44.95 
end_element_namespace: name: price prefix: uri: 
characters: 

start_element_namespace: name: publish_date attrs: [] prefix: uri: ns: [] 
characters: 2000-10-01 
end_element_namespace: name: publish_date prefix: uri: 
characters: 

start_element_namespace: name: description attrs: [] prefix: uri: ns: [] 
characters: An in-depth look at creating applications 
     with XML. 
end_element_namespace: name: description prefix: uri: 
characters: 

end_element_namespace: name: book prefix: uri: 
characters: 
end_element_namespace: name: catalog prefix: uri: 
end_document 
+0

Fehler aktualisieren: Dokument mit der Bezeichnung UTF-16 aber hat UTF-8 Inhalt –

Verwandte Themen