tags:

views:

240

answers:

2

How to represent the following data in XML format?

commandA                 ( a | b | c )

position = pos [(m | n | o )]

[space = space] [(m|n|o)]      

[option1]

[option2 = "Hello"]

[option3]

Note: [ ] --> denotes optional,

( ) --> denotes mandatory

| --> denotes anyone of the value

Eg:

 commandA a position = 1.0<m> space = 2.0<n> option1  option2="Hello"

How to effectively represent this data in xml?

I tried something like this,

<command name="commandA" position = "position" >
     <option name="option1"/>  
     <option name="option2" value = "Hello"/>
     <option name="option3"/>
</command>

But how to handle the command value i.e a|b|c and position i.e m|n|o ?

EDIT: Command: Syntax:

commandA (a|b|c) pos=0[w|x|y|z] [spa=0.0[w|x|y|z]] [str="Hello"]

commandA a pos=0w spa=0.0z str="Hello"

I tried something like this,

   <command name="commandA">
 <direction>
    <direction name="a"/>
    <direction name="b">
    <direction name="c"/>
 </direction>
 <parameter>
    <position value="pos=0" />
    <spacing value="spa=0.0" />
    <options>
        <option name="w"/>
        <option name="x"/>
        <option name="y"/>
        <option name="z"/>
    </options>
 </parameter>
 <string value="str=" />
 </command>

Any suggestions on this?

+3  A: 
<command value="a">
   <position type="m">1.0</position>
   <space type="m">2.0</space>
   <option1 />
   <option2>Hello</option2>
   <option3 />
</command>

Is that what you're looking for? Or do you want a DTD?

Borealid
Thanks. a, b,c and m,n,o are fixed. How to store all of them? Alsom =1.0 or m=2.0 are dummy values. These values are be taken from the user. Basically I am trying for context based auto completion using this xml file.
RP
RP, platforms like eclipse will add auto completion and popup help if the XML file includes or references a DTD with the appropriate constraints.
no
Yup. But I am developing a customized editor with it's own auto completion support.
RP
Then you should definitely look into DTDs, because that's pretty much how it's done :) I'll post a sample based on your original post in a bit.
no
Can you please post a sample DTD for the command? Thanks.
RP
Thank you Borealid.
RP
+4  A: 

How about something like this. It combines tags to guide the autocompletion, along with tags for the command DOM:

<ac:autocomlete>
  <command>   
    <command-name>commandA</command-name>
    <separator> </separator>
    <ac:choice>
      <command-type>a</command-type>
      <command-type>b</command-type>
      <command-type>c</command-type>
    </ac:choice>
    <separator> </separator>
    <pos>
       <pos-text>pos=</pos-text>
       <pos-value><ac:match regex="\d+"/></pos-value>
       <ac:optional>
          <ac:choice>
             <pos-unit>w</pos-unit>
             <pos-unit>x</pos-unit>
             <pos-unit>y</pos-unit>
             <pos-unit>z</pos-unit>
          </ac:choice>
       </ac:optional>
    </pos>
    <ac:optional>
       <spa-separator> </spa-separator>
       <spa>
          <spa-text>spa=</spa-text>
          <spa-value><ac:match regex="\d+\.\d+"/></spa-value>
          <ac:optional>
            <ac:choice>
               <spa-unit>w</spa-unit>
               <spa-unit>x</spa-unit>
               <spa-unit>y</spa-unit>
               <spa-unit>z</spa-unit>
            </ac:choice>
          </ac:optional>
       </spa>
    </ac:optional>
    <ac:optional>
       <arg-separator> </arg-separator>
       <arg-name>str=</arg-name>
       <arg-value><ac:match regex='"[^"]*"'/></arg-value>
    </ac:optional>
  </command>
</autocomlete>

The autocompletion code matches literal element text exactly once, unless it is contained in a choice or optional tag, which changes the behavior accordingly. I've put these autocomplete tags in a separate namespace, to separate what the auto-complete code recognises, and what is the DOM, although you don't have to maintain a separate namespace if you don't want to.

The match tag matches/completes text according to a regular expression. When building the DOM, the match tags are replaced with the literal text that was entered.

The auto-complete tags tell the auto-completion how to deal with child tags. The names of the child tags are arbitrary and are not used by auto-completion, but can be used in building a DOM for your command that the user has typed in: once the auto-complete has built the model, and auto-complete tags removed, what remains is a DOM for the command the user typed in.

mdma
Thank you mdma for the sample xml and detailed explanation.
RP