Tim*_*mer 1 database search autoit
化学品有商品名称(通常称之为)和实际的化学名称.我需要查找商品名称,找到其正确的化学名称,然后获得该化学品的属性.例如:
$tradeName = "Voranol"
if $tradeName == "Voranol" then
$productName = "Polyether Polyol"
$flare = "List I"
$bay = "1"
$listPos = 3
EndIf
Run Code Online (Sandbox Code Playgroud)
我有一个包含大量产品的.au3文件.它工作正常,但这样做很乏味if $tradeName == "Name1" or $tradeName == "Name2" or $tradeName == "Name4" or $tradeName == "Name5".我还需要能够以编程方式编辑它.这就是我现在使用的:
if $product == "dowanol pmb" or $product == "dowanol pma" or $product == "dipropylene glycol" or $product == "dowanol pnp" or $productCheck2 == "dowanol pmb" or $productCheck2 == "dowanol pma" or $productCheck2 == "dipropylene glycol" or $productCheck2 == "dowanol pnp" then
$result = "DIPROPYLENE GLYCOL"
$bay = 4
$useFlare = 1
$listPos = 2
elseif $product == "glycol blend" then
$result = "GLYCOL"
$bay = 3
$useFlare = 2
$listPos = 1
elseif $product == "isopar e" or $product == "isopar c" or $product == "isopar h" or $productCheck2 == "isopar h" then
$result = "PETROLEUM NAPTHA"
$bay = 5
$useFlare = 0
$listPos = 1
EndIf
; Note: 0 = No Flare, 1 = Normal Flare, 2 = CAS Flare
Run Code Online (Sandbox Code Playgroud)
数据库选项的另一种替代方法是使用XML文档来存储产品(化学品)信息.
您可以使用XPath轻松查询XML以获取产品名称/属性.维护文件也很容易.您甚至可以创建一个XML Schema进行验证,以确保您的文件在修改后仍然有效.
AutoIt中的XML处理可以通过几种不同的方式完成:
像萨克森这样的运行对你所需要的东西来说可能有些过分.
MSXML不会太糟糕,应该有多个已经存在的UDF.
Xmlstarlet将是我的投票.(注意:我以前没有以这种方式使用过xmlstarlet.我是Saxon的忠实粉丝并且几乎专门使用它.特别是对于AutoIt,我使用了MSXML和Saxon的组合; Saxon用于复杂的转换将数据转换为更小,更简单的子集,然后使用MSXML对该子集进行简单的xpath查询.但是,如果我要做这样的事情,我会认真对待xmlstarlet.)
此外,如果您的数据增长到单个XML文件没有意义的程度,您可以始终将其拆分为较小文件的集合; 个别产品也许.您可能还可以将这些文件加载到实际的XML数据库中(eXistdb是一个选项).
这是一个简单的例子,说明你的XML(模式和实例)可能是什么样子:
XSD(products.xsd)
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="products">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="product"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="product">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="tradenames"/>
</xs:sequence>
<xs:attribute name="bay" use="required" type="xs:integer"/>
<xs:attribute name="listpos" use="required" type="xs:integer"/>
<xs:attribute name="useflare" use="required" type="xs:integer"/>
</xs:complexType>
</xs:element>
<xs:element name="tradenames">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="name"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="name" type="xs:string"/>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
XML(products.xml)
<products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="products.xsd">
<product bay="4" useflare="1" listpos="2">
<name>DIPROPYLENE GLYCOL</name>
<tradenames>
<name>dowanol pmb</name>
<name>dowanol pma</name>
<name>dipropylene glycol</name>
<name>dowanol pnp</name>
</tradenames>
</product>
<product bay="3" useflare="2" listpos="1">
<name>GLYCOL</name>
<tradenames>
<name>glycol blend</name>
</tradenames>
</product>
<product bay="5" useflare="0" listpos="1">
<name>PETROLEUM NAPTHA</name>
<tradenames>
<name>isopar e</name>
<name>isopar c</name>
<name>isopar h</name>
</tradenames>
</product>
</products>
Run Code Online (Sandbox Code Playgroud)
这里有一点AutoIt,它使用MSXML演示加载XML(针对XSD验证)和搜索商品名称包含"glycol"的产品.
AutoIt的
;~ AutoIt Version: 3.3.14.2
;String to search on.
$searchString = "glycol"
ConsoleWrite("Search string: '" & $searchString & "'" & @CRLF)
;XPath for searching trade names. Search string is injected (code injection; escaping of strings would be a very good idea!).
$xpath_tradename = "/products/product[tradenames/name[contains(.,'" & $searchString & "')]]"
ConsoleWrite("XPath: '" & $xpath_tradename & "'" & @CRLF)
$msxml = ObjCreate('MSXML2.DOMDocument.6.0')
If IsObj($msxml) Then
$msxml.async = False
$msxml.validateOnParse = True
$msxml.resolveExternals = True
$msxml.setProperty("SelectionLanguage", "XPath")
$msxml.load('products.xml')
If $msxml.parseError.errorCode = 0 Then
$prods = $msxml.SelectNodes($xpath_tradename)
If IsObj($prods) And $prods.Length > 0 Then
ConsoleWrite("Number of products found: '" & $prods.Length & "'" & @CRLF)
For $prod In $prods
ConsoleWrite(@CRLF & "------ PRODUCT ------" & @CRLF)
ConsoleWrite("Product name: '" & $prod.SelectSingleNode('name').text & "'" & @CRLF)
ConsoleWrite("Product bay: '" & $prod.getAttribute('bay') & "'" & @CRLF)
Next
ConsoleWrite(@CRLF)
Else
ConsoleWrite("PRODUCT NOT FOUND" & @CRLF)
EndIf
Else
MsgBox(17, 'Error', 'Error opening XML file: ' & @CRLF & @CRLF & $msxml.parseError.reason)
SetError($msxml.parseError.errorCode)
EndIf
EndIf
Run Code Online (Sandbox Code Playgroud)
控制台输出
Search string: 'glycol'
XPath: '/products/product[tradenames/name[contains(.,'glycol')]]'
Number of products found: '2'
------ PRODUCT ------
Product name: 'DIPROPYLENE GLYCOL'
Product bay: '4'
------ PRODUCT ------
Product name: 'GLYCOL'
Product bay: '3'
Run Code Online (Sandbox Code Playgroud)