2016-04-12 8 views
1

Ich benutze ZBar, um QR-Codes aus gescannten Bilddateien zu lesen und Probleme beim Parsen der XML, die ZBar in meinen SQL-Skripten generiert.Wie benutze ich zBar generierte XML in SQL

Hintergrund ist ZBar ein Open-Source-Barcode-Lesetool. Neben dem Quellcode zur Verwendung in eigenen Projekten gibt es ein Befehlszeilentool (zBARmg.exe) zum Lesen von Barcodes (einschließlich QR-Codes) aus Bilddateien. Ich habe zBar funktioniert gut, so ist diese Frage speziell darüber, wie Sie die XML verwenden, die es in meinen SQL-Skripten generiert.

Ich bin mit dem ZBar Kommandozeilenprogramm (zbarimg) Bilder zu lesen, die auf jedem Bild zwei QR-Codes haben und es erzeugt diese XML-Datei:

<barcodes xmlns="http://zbar.sourceforge.net/2008/barcode"> 
    <source href="C:\BC\SCanner\2016_03_12_14_19_44.jpg"> 
    <index num="0"> 
     <symbol type="QR-Code" quality="1"> 
     <data>F01868</data> 
     </symbol> 
     <symbol type="QR-Code" quality="1"> 
     <data>TC16-A397</data> 
     </symbol> 
    </index> 
    </source> 
    <source href="C:\BC\SCanner\2016_03_12_14_19_46.jpg"> 
    <index num="0"> 
     <symbol type="QR-Code" quality="1"> 
     <data>F01869</data> 
     </symbol> 
     <symbol type="QR-Code" quality="1"> 
     <data>TC16-A397</data> 
     </symbol> 
    </index> 
    </source> 
    <source href="C:\BC\SCanner\2016_03_12_14_19_48.jpg"> 
    <index num="0"> 
     <symbol type="QR-Code" quality="1"> 
     <data>F01870</data> 
     </symbol> 
     <symbol type="QR-Code" quality="1"> 
     <data>TC16-A397</data> 
     </symbol> 
    </index> 
    </source> 
</barcodes> 

Dies funktioniert gut, und ich kann alles sehen die Informationen, die ich brauche. Zum Beispiel auf dem ersten Bild habe ich die Dateinamen und den beide QR-Codes:

<source href="C:\BC\SCanner\2016_03_12_14_19_46.jpg"> 
<symbol type="QR-Code" quality="1"><data>F01868</data> 
<symbol type="QR-Code" quality="1"><data>TC16-A397</data> 

Ich habe Probleme beim Parsen/Lektüre dieses in eine nutzbare Tabelle.

Ich denke, mein Problem versucht zuerst ein Element und dann Knoten zu bekommen ... aber ich bin auch verwirrt, warum sie den Index immer Null ist und es scheint im Allgemeinen eine seltsame Art, die XML zu mir zu strukturieren.

Antwort

2

OK, also habe ich einen Weg gefunden, dies zu tun, der für meine Bedürfnisse funktioniert hat, also wollte ich das teilen ... und auch sehen, ob es elegantere Lösungen gibt, mit denen die Community kommen könnte.

Erstellen Sie eine Tabelle und ziehen Sie das XML in SQL. Ich bin eigentlich auf einmal einen Stapel von vielen XML-Dateien zu tun, es so hier stark vereinfacht:

CREATE TABLE [dbo].[zBar_Batches](
     [ZBatchID] [int] IDENTITY(1,1) NOT NULL, 
     [Filename] [nvarchar](255) NULL, 
     [BarCodeXML] [xml] NULL, 
     [Status] [nvarchar](50) NULL 
     ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

     INSERT INTO zBar_Batches (Filename, BarCodeXML, Status) Values ('C:\BC\Logs\barcodes.xml', '', 'New Batch') 
     UPDATE zBar_Batches SET BarCodeXML =(SELECT * FROM OPENROWSET(BULK 'C:\BC\Logs\barcodes.xml', SINGLE_BLOB) AS x) WHERE Filename = 'C:\BC\Logs\barcodes.xml' 

Was hatte mich mehrere Tage aufgehängt war direkt vor meinen Augen die ganze Zeit ... Ich habe ganz vergessen zu Setze den voreingestellten NAMESPACE. Als ich das einmal geknackt habe, sind die Dinge viel besser gelaufen. Ich war es so gewohnt, die erste Zeile der XML-Datei zu ignorieren, oder nur auf die Codierung zu sehen. Ich muss XMLNAMESPACES (DEFAULT 'http://zbar.sourceforge.net/2008/barcode') verwenden, was eine Lektion war, die ich hier gelernt habe.

Sobald ich das Quadrat entfernt hatte, begannen alle Untersuchungen, die ich über Stack Overflow gemacht hatte, zu arbeiten, und das Beste, was mir einfiel, war dies. Ich werde der Erste sein, der zugibt, dass die Cross-Tab-Select-Abfrage aus ein paar großen Überlauf-Threads zusammengeschustert wurde, da dies zu der Zeit weit über meine ursprünglichen Fähigkeiten hinausging.

IF OBJECT_ID('tempdb..#Pages') IS NOT NULL DROP TABLE #Pages 
    CREATE TABLE #Pages(
     [zbarID] [int] IDENTITY(1,1) NOT NULL, 
     [FilePath] [varchar](255) NULL, 
     [QRcode] [varchar](50) NULL 
    ) 

DECLARE @zXML xml 

SELECT @zXML = BarCodeXML from zBar_Batches where ZBatchID= @BatchID and BarCodeXML is not null 
;WITH XMLNAMESPACES(DEFAULT 'http://zbar.sourceforge.net/2008/barcode') 
INSERT INTO #Pages 
select batch.src.value('@href','varchar(255)') as FilePath, 
    batch1.sym.value('data[1]','varchar(50)') as QRcode 
    from @zXML.nodes('/barcodes/source') as batch(src) 
    cross apply batch.src.nodes('index/symbol') as batch1(sym) 

Das gab mir sechs Zeilen ... eine für jeden Barcode (2 auf jedem der 3 Bild).

zbarID FilePath        QRcode 
------- --------------------------------------- ----------- 
1  C:\BC\SCanner\2016_03_12_14_19_44.jpg F01868 
2  C:\BC\SCanner\2016_03_12_14_19_44.jpg TC16-A397 
3  C:\BC\SCanner\2016_03_12_14_19_46.jpg F01869 
4  C:\BC\SCanner\2016_03_12_14_19_46.jpg TC16-A397 
5  C:\BC\SCanner\2016_03_12_14_19_48.jpg F01870 
6  C:\BC\SCanner\2016_03_12_14_19_48.jpg TC16-A397 

Natürlich habe ich noch einige Validierungsarbeiten zu tun und auf das Format des qrcode Wert verlassen müssen zu wissen, welche Code es war, aber kam zusammen ziemlich schnell,

Ich hoffe, das jemand hilft sonst versuchen, zBar xml mit einem SQL zu verwenden. Ich würde gerne Feedback zu der letzten Abfrage sehen.

Wenn Sie interessiert sind, hat auch ZBar eine Befehlszeile zum Lesen von einer Webcam, die an den Computer angeschlossen ist. Das Dienstprogramm zBarImg hat sehr gut für mich funktioniert. Es war in der Lage, beide QR-Codes in 98% der fast 1500 Bilder, für die ich es verwendete, genau zu lesen.

+0

Hallo, das ist eine großartige Antwort und ich hoffe, dass genug Leute darüber abstimmen, um Sie mit dem [Selbstlerner-Abzeichen] (http: // stackoverflow.com/help/badges/14/Selbstlerner) – Shnugo