Thanks Nuwan for the response.

When generating the avro schema by adding elements to the tree view, user
can specify the namespace (xml namespace) with the prefix, so that when
generating the the avro schema we can map the namespace to doc and prefix
to the namespace in avro.

Thanks,
Sohani

Sohani Weerasinghe
Software Engineer
WSO2, Inc: http://wso2.com

Mobile  : +94 716439774
Blog     :http://christinetechtips.blogspot.com/
Twitter  : https://twitter.com/sohanichristine

On Tue, Mar 1, 2016 at 8:54 PM, Nuwan Pallewela <nuw...@wso2.com> wrote:

>
>
> On Tue, Mar 1, 2016 at 7:34 PM, Sohani Weerasinghe <soh...@wso2.com>
> wrote:
>
>> Hi All,
>>
>> If we consider an XML which has multiple namespaces as below ,
>>
>> <root>
>> <h:table xmlns:h="http://www.w3.org/TR/html4/";>
>>   <h:name>Asian Coffee Table</h:name>
>>   <h:width>74</h:width>
>>   <h:length>129</h:length>
>> </h:table>
>> <f:table xmlns:f="http://www.w3schools.com/furniture";>
>>   <f:name>African Coffee Table</f:name>
>>   <f:width>80</f:width>
>>   <f:length>120</f:length>
>> </f:table>
>> </root>
>>
>> The avro schema should be as follows ,
>>
>> {
>>   "type" : "record",
>>   "name" : "root",
>>   "fields" : [ {
>>         "type" : "record",
>>         "name" : "tableRecord",
>>        * "doc" : "http://www.w3.org/TR/html4/
>> <http://www.w3.org/TR/html4/>",*
>>         "namespace" : "http://www.w3.org/TR/html4/";
>>         "fields" : [ {
>>           "name" : "name",
>>           "type" : [ "null", "string" ]
>>           "doc" : "http://www.w3.org/TR/html4/";
>>           } , {
>>           "name" : "width",
>>           "type" : [ "null", "int" ]
>>           },{
>>           "name" : "length",
>>           "type" : [ "null", "int" ]
>>           }]
>>         }, {
>>         "type" : "record",
>>         "name" : "tableRecord",
>>       *  "doc" : "http://www.w3schools.com/furniture
>> <http://www.w3schools.com/furniture>",*
>>         "namespace" : "http://www.w3schools.com/furniture";
>>         "fields" : [ {
>>           "name" : "name",
>>           "type" : [ "null", "string" ]
>>           } , {
>>           "name" : "width",
>>           "type" : [ "null", "int" ]
>>           },{
>>           "name" : "length",
>>           "type" : [ "null", "int" ]
>>           }]
>>         } ]
>> }
>>
>> When representing this using the Visual DataMapper Editor, in order to
>> differentiate the two records, we can add a namespace prefix to the name of
>> the record as shown below.
>>
>>
>> ​But when generating the Avro Schema, if we pass this value as the name
>> of the node it  throws *org.apache.avro.SchemaParseException: Illegal
>> character in: y:tableRecord.*
>>
>
> AVRO name should start with [A-Za-z] and subsequently contain only  
> [A-Za-z0-9_].
> So we can not pass name with namespace prefix.
>
>>
>> So, if we use only the name (tableRecord, by removing the prefix) to
>> create the avro schema, how are we going to differentiate the records
>> separately when generating the mapping config?
>>
>
>  We should add above xml namespace prefix as the namespace of AVRO record.
> Then two elements can be differentiated.
> For Eg:
>
> {
>   "type" : "record",
>   "name" : "root",
>   "fields" : [ {
>         "type" : "record",
>         "name" : "tableRecord",
>        * "doc" : "http://www.w3.org/TR/html4/
> <http://www.w3.org/TR/html4/>",*
>         "namespace" : "N1",
>         "fields" : [ {
>           "name" : "name",
>           "type" : [ "null", "string" ],
>           "doc" : "http://www.w3.org/TR/html4/";
>           } , {
>           "name" : "width",
>           "type" : [ "null", "int" ],
>           "doc" : "http://www.w3.org/TR/html4/";
>           },{
>           "name" : "length",
>           "type" : [ "null", "int" ],
>           "doc" : "http://www.w3.org/TR/html4/";
>           }]
>         }, {
>         "type" : "record",
>         "name" : "tableRecord",
>       *  "doc" : "http://www.w3schools.com/furniture
> <http://www.w3schools.com/furniture>",*
>         "namespace" : "N2",
>         "fields" : [ {
>           "name" : "name",
>           "type" : [ "null", "string" ],
>           *"doc" : "http://www.w3schools.com/furniture
> <http://www.w3schools.com/furniture>"*
>           } , {
>           "name" : "width",
>           "type" : [ "null", "int" ]
>           *"doc" : "http://www.w3schools.com/furniture
> <http://www.w3schools.com/furniture>"*
>           },{
>           "name" : "length",
>           "type" : [ "null", "int" ],
>           *"doc" : "http://www.w3schools.com/furniture
> <http://www.w3schools.com/furniture>"*
>           }]
>         } ]
> }
>
> Then the full names of the two tableRecords will be N1.tableRecord and
> N2.tableRecord and AVRO can differentiate these two fields.
>
>>
>> eg: If we are to map a field in  y:tableRecord with a field
>> in y:tableRecord etc. How can we differentiate this?
>>
>> This usecase of having multiple namespaces can be displayed graphically
>> in the Design view by appending a namespace prefix, but it seems this will
>> have issues in generating the avro schema and the mapping config.
>>
>
> Mapping configuration does not need to be aware of the namespaces as long
> as they can be differentiate in the diagram. Output from the mapping will
> look into the output schema and will build the output message with desired
> namespaces.
>
>>
>> Your suggestions are highly appreciated.
>>
>> Thanks,
>> Sohani
>> Sohani Weerasinghe
>> Software Engineer
>> WSO2, Inc: http://wso2.com
>>
>> Mobile  : +94 716439774
>> Blog     :http://christinetechtips.blogspot.com/
>> Twitter  : https://twitter.com/sohanichristine
>>
>
>
>
> --
> ----------------------------------------------------------
>
> *Nuwan Chamara Pallewela*
>
>
> *Software Engineer*
>
> *WSO2, Inc. *http://wso2.com
> *lean . enterprise . middleware*
>
> Email   *nuw...@wso2.com <nuw...@wso2.com>*
> Mobile  *+94719079739 <%2B94719079739>@*
>
>
>
_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to