我正在使用zBar从扫描的图像文件中读取QR代码,并且很难解析zBar在我的SQL脚本中生成的XML。
对于背景,zBar是一个开放源代码的条形码读取工具。除了在您自己的项目中使用的源代码之外,还有一个命令行工具(zBarImg.exe)可以从图像文件中读取条形码(包括QR代码)。我让zBar工作得很好,所以这个问题是关于如何使用它在我的SQL脚本中生成的XML。
我使用ZBar命令行实用工具(zbarimg)读取每个图像上有两个qr代码的图像,它生成这个xml文件:
<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>这很好,我可以看到我需要的所有信息。例如,在第一个图像中,我得到了文件名和两个qr代码:
<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>我很难将它解析/读取到一个可用的表中。
我想我的问题是先得到一个元素然后是节点..。但我也很困惑,为什么索引总是为零,对我来说,构造xml似乎是一种奇怪的方式。
发布于 2016-04-12 02:46:16
好吧,所以我想出了一种能满足我需要的方法,所以我想和大家分享.并看看是否有更优雅的解决方案,社区可以提出。
创建一个表并将xml拖到SQL中。实际上,我正在一次执行一批许多xml文件,因此在这里对其进行了过度简化:
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'我挂了几天的东西一直就在我眼前.我完全忘记了设置默认名称空间。一旦我解决了这个问题,事情就开始好转了。我习惯于忽略xml文件的第一行,或者只看编码。我需要使用XMLNAMESPACES(默认的'http://zbar.sourceforge.net/2008/barcode'),这是我们在这方面学到的一课。
一旦我得到了这个平方,我所做的关于堆栈溢出的所有研究都开始起作用了,我想出的最好的方法就是这个。我将是第一个承认交叉选项卡select查询是从几个巨大的溢出线程中拼凑而成的,因为这远远超出了我当时的能力。
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)这给了我六排。每个条形码一张(3张图像中各有2张)。
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当然,我还有一些验证工作要做,并且需要依赖qrcode值的格式来知道它是哪一种代码,但是很快就聚在一起了,
我希望这能帮助其他尝试在sql中使用zBar xml的人。我希望看到任何反馈的最后查询。
如果您感兴趣,zBar也有一个命令行从连接到计算机的摄像头读取。zBarImg实用程序对我非常有用。它能够准确地读取这两个QR代码,在我使用它的近1500张图像中,98%是正确的。
https://stackoverflow.com/questions/36562690
复制相似问题