Re: Expat and JavaScript

Franky Braem <[email protected]>
Newsgroups gmane.text.xml.expat.general
Message-ID <[email protected]>
Karl Waclawek wrote:
> Franky Braem wrote:
>   
>> I'm porting expat to JavaScript (using SpiderMonkey, see my wxJS 
>> project). The application is in Unicode.
>> I have the following problem:
>>
>> When I pass a normal JavaScript string (SpiderMonkey uses UTF-16) to a 
>> 'print' method I don't have to do any conversions to write the data to 
>> stdout.
>> When I use a string generated by expat (it is build in UNICODE and 
>> creates data in UTF-16) I have to do a conversion before I can send the 
>> string to the 'print' method.
>> When I look at the expat string in debug mode, I see all weird Chinese 
>> characters. When I debug the normal JavaScript string, I see normal text.
>> Is there a conversion needed between SpiderMonkey and Expat?
>>
>> Maybe this JavaScript code makes some things clearer:
>>
>> p.parse('<tag1 attr="1" attr2="2"><child1>child</child1></tag1>', true);
>> if ( p.currentElement.name == "tag1")
>> {
>>  wxJS.print("Ok");
>> }
>> else
>> {
>>  wxJS.print("Not ok");
>> }
>> wxJS.print(p.currentElement.name);
>>
>> The comparison always fails (all though the parsing in expat went fine)
>>
>>   
>>     
>
> How does p.currentElement.name get its value from Expat
This is how it is done:

void XMLParser::StartElementHandler(void *userData,
                                    const XML_Char *name,
                                    const XML_Char **atts)
{
    wxMBConvUTF16 conv;
    XMLParser *parser = (XMLParser*) userData;

    wxString element(name, conv);

    ...

    jsval rval;
    jsval argv[] =
    {
        JS_NewUCStringCopyN(cx, (jschar *) element.c_str(), 
element.length()));
        OBJECT_TO_JSVAL(objAttr)
    };

    wxJS_CallFunctionProperty(parser->m_cx, parser->m_obj, "onStartElement",
                              2, argv, &rval);
}


the element name is passed to the onStartElement function. And that's a 
JavaScript function that sets the current element.

When I do the following conversion. It seems to work:

    wxCharBuffer s = conv.cWC2MB(element);
    wxWCharBuffer t = wxConvCurrent->cMB2WC(s);
    element = t;


The full Javascript code:

// Constructor for a XMLElement object
function XMLElement(parent, name, attrs)
{
  this.parent = parent;
  if ( parent != null )
    parent.elements[parent.elements.length + 1] = this;
  this.name = name;
  this.attrs = attrs;
  this.elements = new Array();
}

var p = new XMLParser();
p.currentElement = null;

p.onStartElement = function(element, attrs)
{
  currentElement = new XMLElement(currentElement, element, attrs);
}

p.onEndElement = function(element)
{
  if ( currentElement.parent != null )
     currentElement = currentElement.parent;
}

p.onCharacter = function(data)
{
  currentElement.data = data;
}

p.parse('<tag1 attr="1" attr2="2"><child1>child</child1></tag1>', true);
if ( p.currentElement.name == "tag1")
{
  wxJS.print("Ok");
}
else
{
  wxJS.print("Not ok");
}
wxJS.print(p.currentElement.name);
// p.currentElement points to the root tag now(tag1)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.