Structura unui cuvant in limbaj

Fiecare definitie de cuvant are 3 zone: header, nodes si actions iar structura arata in felul urmator:

<nume_cuvant>
  <header>
    ...
  </header>
  <nodes>
    ...
  </nodes>
  <actions>
    ...
  </actions
</nume_cuvant>

Header

Aceasta zona este pur informativa si are doar doua noduri: objectName si objectType.

Nodul objectName are ca valoare numele cuvantului, iar objectType are valoarea xml

<nume_cuvant>
  <header>
    <objectName>nume_cuvant</objectName>
    <objectType>xml</objectType>
  </header>
  ...
</nume_cuvant>

Nodes

In aceasta sectiune se afla definitia/sintaxa mesajului in sine. Astfel nodul nodes poate contine unul sau mai multe noduri node.

<nodes>
  <node/>
  <node/>
  ...
  <node/>
</nodes>

Fiecare nod node are urmatoarele atribute:

  • name – numele nodului
  • type – tipul de date (String, long, int)
  • regex – expresia regulara care valideaza forma datelor continute de acel nod
  • minrep – numarul minim de repetitii ale nodului
  • maxrep – numarul maxim de repetitii ale nodului – pentru un maxim nedefinit se foloseste valoarea 0(zero)
  • detail – este optional si contine un text care explica rolul, valoarea si/sau forma corecta a valorii nodului
  • default – este optional si este utilizat de obicei atunci cand numarul minim de repetitii ale unui nod este 0(zero)

Exemplu:

<nodes>
  <node name="a" type="String" regex="[\p{Print}]*" minrep="0" maxrep="1" default="valoare implicita" />
  <node name="b" type="int" regex="[0-9]+" minrep="1" maxrep="1" detail="Valoarea este numerica si obligatorie" />
</nodes>

Un nod poate sa contina un set de date simplu, pentru care se utilizeaza definitiile de mai sus, sau poate contine o structura complexa de date, in consecinta definitia acestuia poate contine alte tipuri de noduri cum ar fi:

  • attr – atribute de nod xml
  • node – subnoduri xml
  • preaction – daca trebuie realizate actiuni inaintea terminarii analizei, acestea sunt definite aici.
  • source – daca nodul are ca valoare un alt cuvant se folose4ste un astfel de subnod pentru a indica sursa definitiei subcuvantului

Nodurile attr

Nodurile /node/attr au doar trei dintre atibutele nodurilor /node: name, type si regex.

 

Subnodurile node

Nodurile /node/node se comporta identic cu /node, iar aceasta cascadare nu are o anumita limita(software).

Nodurile preaction

Acestea permit realizarea de actiuni inaintea terminarii analizei mesajului. Pentru mai multe detalii vezi Preactiuni.

Nodul source

Nodurile /node/source sunt noduri decizionale, acestea fiind cele care faciliteaza alegerea, in functie de o valoare aflata la un nivel superior in mesaj, a sursei pentru analiza subcuvantului aflat in interiorul nodului parinte(/node)

Aceste noduri au trei posibile atribute:

  • type – valori posibile: switchAttr sau switchNode
  • attr – obligatoriu daca type=switchAttr
  • node – obligatoriu daca type=switchNode

Atributele attr si node contin calea(din mesaj) valorii care determina locatia/tipul subcuvantului care urmeaza sa fie analizat

Nodul source are unul sau mai multe subnoduri case in care se specifica, in functie de valoarea discutata mai sus, unde este definitia pe care trebuie sa o urmareasca analiza mesajului in continuare

Nodurile /source/case au trei atribute:

  • regex – expresia regulara conforma careia se selecteaza acea ramura
  • sourceType – valorile acceptate fiind node, daca definitia se afla in acelasi fisier specificand numele nodului/cuvantului, sau file, daca definitia se afla in alt fisier de limbaj
  • name – dupa caz, numele nodului sau fisierului(fara extensie) in care se afla definitia

Exemplu limbaj:

<xmllanguage>
 <info name="FlexClient" version="2.70.18" date="12.10.2016" />
 <components>
   <FlexClient>
     <header>
       <objectName>FlexClient</objectName>
       <objectType>xml</objectType>
     </header>
     <nodes>
       <node name="m" type="String" regex="[\u0000-\uFFFF]*" minrep="1" maxrep="0" >
         <attr name="t" type="String" regex="[\p{Print}]+" />
         <source type="switchAttr" attr="/m/t">
           <case regex="ping\?" sourceType="node" name="ping" />
           <case regex="(report)|(raport)" sourceType="file" name="Reports"/>
         </source>
       </node>
     </nodes>
   </FlexClient>
   <ping>
     ...
   </ping>
 </components>
</xmllanguage>

Exemplu mesaj:

 <?xml version="1.0" encoding="UTF-8"?>
<x>
 <m t="report">
   <report type="legitimatie">
     ...
   </report>
 </m>
</x>

In exemplul de mai sus, datorita faptului ca, conform definitiei, valoarea atributului /m/t este report, algoritmul de analiza va selecta al doilea nod case si va folosi in continuare pentru analiza fisierul Reports.xml.

Daca, in schimb, valoarea era ping? analiza continua conform definitiei nodului ping din acelasi fisier.

Actions

Nodul actions este optional si poate contine unul sau mai multe subnoduri action.

Pentru detalii despre aceste noduri vezi Actiuni.

Sidebar