[xsd-users] Help me: Access Violation on optional element during serialization

James Mei jxmei3 at gmail.com
Wed Oct 28 04:36:45 EDT 2009


Hi Boris

I have tried MS VC++ express, Pro and Borland BCB2007, 2009, 2010
compilers on XSD generated files. Other than BCB2007, other compiler
works to certain extends.

MS VC++ express and Pro works with no problem. The down side is that
it only works on Win32, not .NET (or Xerces works on Win32 only). In
this case, it limits the number of GUI controls I can put in. It would
be difficult to program if it needs a big "case WM_COMMAND" instead of
the .NET GUI event driven API.

BCB2007: It requires the container.hxx to be modified to allow the
program to be compiled. But after that, no attributes are output.

BCB2009 and BCB2010: (The advantages of BCB2009/BCB2010 is that the
GUI is Win32 based with event driven API. Similar to .NET and works
with XSD. )

No files need to be modified. Most XML parse correctly and output
correctly, except some "optional" elements. With the above example
schema:

SCL->Communication->SubNetwork->BitRate
SCL->Communication->SubNetwork->ConnectedAP->GSE->MinTime
SCL->Communication->SubNetwork->ConnectedAP->GSE->MaxTime
.....
The above elements are optional. If the elements do not exist in the
xml file or I "reset()" the pointer (delete it), XSD works perfectly.
If they are presented in the xml file, the parser and data structure
works correctly. I can display all the members of the those optional
class. However, when I pass the *SCL to the serialization function,
"access violation" on the following code in string.txx

        template <typename C>
        XMLCh* char_transcoder<C>::
        from (const C* s, std::size_t len)
        {
          bool valid (true);
          const C* end (s + len);

          // Find what the resulting buffer size will be.
          //
          std::size_t rl (0);
          unsigned int count (0);

          for (const C* p (s); p < end; ++p)
          {
            unsigned char c (*p);
//<--------access violation

            if (c < 0x80)
            {
              // Fast path.
              //
              rl += 1;
              continue;
            }
            else if ((c >> 5) == 0x06)
              count = 2;
            else if ((c >> 4) == 0x0E)
              count = 3;
            else if ((c >> 3) == 0x1E)
              count = 4;
            else
            {
              valid = false;
              break;
            }

            p += count - 1; // One will be added in the for loop

            if (p + 1 > end)
            {
              valid = false;
              break;
            }

            // BMP is represented by up to 3 code points in UTF-8.
            //
            rl += count > 3 ? 2 : 1;
          }

 Thanks for your help again.

Cheers
James
-------------- next part --------------
A non-text attachment was scrubbed...
Name: SCL.zip
Type: application/zip
Size: 24318 bytes
Desc: not available
Url : http://codesynthesis.com/pipermail/xsd-users/attachments/20091028/8bdac8aa/SCL-0001.zip


More information about the xsd-users mailing list