数据库,关系查询

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)

Dan*_*ley 5

数据库选项的另一种替代方法是使用XML文档来存储产品(化学品)信息.

您可以使用XPath轻松查询XML以获取产品名称/属性.维护文件也很容易.您甚至可以创建一个XML Schema进行验证,以确保您的文件在修改后仍然有效.

AutoIt中的XML处理可以通过几种不同的方式完成:

  • 创建MSXML对象
  • 运行xmlstarlet之类的命令行工具
  • 从命令行使用XPath/XQuery/XSLT处理器(即java运行Saxon)

像萨克森这样的运行对你所需要的东西来说可能有些过分.

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)