Hi Nicolas,
I finally tracked down the issue; I placed a breakpoint inside the
SchemaAttDef constructor and used the Object Inspector to see its
values (and they were good), then I did the same on the pointer
returned by getAttDef(). So I noticed that the values were shifted,
and the fAttName was now assigned to 0xFFFFFFE (i.e. -2, or
XMLElementDecl::fgInvalidElemId) that was previously the value of the
fElemId field.
The reason for this different memory layout was that the Xerces
project specifies the option "Treat enum types as ints", while the
project that BC6 creates by default doesn't specify it. Enabling this
option for your testcase fixed the problem.
Hope this helps,
Alberto
At 08:09 AM 3/3/2006 +0200, Nicolas Tsokas wrote:
Hi Alberto,
I have noticed those bogus addresses as well... It is a bit as if those
objects are not valid any more...
I noticed the following comment in file SchemaAttDef.hpp:
// ----------------------------------------------------------------------
// Partial implementation of PSVI
// The values these methods return are only accurate until the DOMAttr
// is created that uses the values. After this a clean up method is called
// and the SchemaAttDef may be used again.
// note that some of this information has dependancies. For example,
// if something is not valid then the information returned by the other
// calls may be meaningless
// See http://www.w3.org/TR/xmlschema-1/ for detailed information
// ----------------------------------------------------------------------
To tell the truth I didn't understand the exact meaning. But maybe it has
something to do with those invalidated objects... (?) I was wondering if
that class SchemaAttDef (or XMLAttDef too) should only be used DURING
parsing... ? And not AFTER parsing like I'm doing... Is that possible?
Thank you so much Alberto for everything.
Nicolas
-----Original Message-----
From: Alberto Massari [mailto:[EMAIL PROTECTED]
Sent: Thursday, March 02, 2006 7:09 PM
To: Nicolas Tsokas
Cc: [email protected]
Subject: RE: Attribute namespace info through PSVI. Please help...!
Hi Nicolas,
thanks for sending the code; I tried with my usual setup (Visual C++
6.0) and it worked just fine. So I tried with Borland C++ 6, and I
see that the attribute name (and other members of the attribute
definition) are set to bogus addresses like 0xFFFFFFE. I am
investigating how this could happen, but I am not very confortable
debugging from inside BC6...
Alberto
At 12:44 PM 3/2/2006 +0200, Nicolas Tsokas wrote:
>Alberto,
>
>I used the code you just gave to me. I'm trying to get a pointer to a QName
>object, but it seems that that object is invalid.
>I get the pointer to QName, but then no matter which method of QName I call
>I get an exception (Access in invalid memory).
>
>XMLAttDefList& attrIter=pComplexType->getAttDefList();
>for(unsigned int i=0;i<attrIter.getAttDefCount();i++)
>{
> XMLAttDef& attr=attrIter.getAttDef(i);
> XMLAttDef::DefAttTypes ty = attr.getDefaultType();
> if(ty == XMLAttDef::Prohibited)
> continue;
> SchemaAttDef* pAttr=(SchemaAttDef*)&attr;
> QName* qname = pAttr->getAttName();
> unsigned int uriid = qname->getURI(); --> I always get an exception
here
> // qname object is invalid
>}
>
>I noticed that you get the ComplexTypeInfo by reference and not a pointer
>
>--> ComplexTypeInfo& curTypeInfo = complexTypeEnum.nextElement(); <--
>
>(how do you do that?... I mean what is "complexTypeEnum?"...)
>
>In contrast, I get a pointer to the ComplexTypeInfo object like the way
>you indicated in one of your posts:
>
>// xmlnode is a DOMNode*...
>DOMPSVITypeInfo* psviType =
>(DOMPSVITypeInfo*)xmlnode->getInterface(XMLUni::fgXercescInterfacePSVITypeI
n
>fo);
> if (!psviType)
> return false;
> const XMLCh* typeName =
>psviType->getStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Name);
> if (!typeName)
> return false;
> const XMLCh* typeURI =
>psviType->getStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Namespace
)
>;
>
> XSTypeDefinition::TYPE_CATEGORY typeType =
>
>(XSTypeDefinition::TYPE_CATEGORY)psviType->getNumericProperty(DOMPSVITypeIn
f
>o::PSVI_Type_Definition_Type);
>
> Grammar* pGrammar=FDOMParser->getGrammar(typeURI);
> if(!pGrammar &&
pGrammar->getGrammarType()!=Grammar::SchemaGrammarType)
> return false;
>
> SchemaGrammar* pSchema=(SchemaGrammar*)pGrammar;
> if(typeType!=XSTypeDefinition::COMPLEX_TYPE)
> return true;
>
> XMLBuffer typeKey(1023);
> typeKey.set(typeURI);
> typeKey.append(chComma);
> typeKey.append(typeName);
> RefHashTableOf<ComplexTypeInfo>* pSchemaTypes =
>pSchema->getComplexTypeRegistry();
> ComplexTypeInfo* pComplexType =
>pSchemaTypes->get(typeKey.getRawBuffer());
>
>
>Thanks again, you help is being priceless!
>
>Nicolas
>
>
>-----Original Message-----
>From: Alberto Massari [mailto:[EMAIL PROTECTED]
>Sent: Thursday, March 02, 2006 12:00 PM
>To: Nicolas Tsokas
>Cc: [email protected]
>Subject: RE: Attribute namespace info through PSVI. Please help...!
>
>At 11:45 AM 3/2/2006 +0200, Nicolas Tsokas wrote:
> >Hi Alberto,
> >
> >Method getAttName() is not implemented in base class XMLAttDef. It's only
> >implemented in class SchemaAttDef.
>
>You're right, I read my code too quickly.... This is what I do:
>
>ComplexTypeInfo& curTypeInfo = complexTypeEnum.nextElement();
>if(curTypeInfo.hasAttDefs())
>{
> XMLAttDefList& attrIter=curTypeInfo.getAttDefList();
> for(unsigned int i=0;i<attrIter.getAttDefCount();i++)
> {
> XMLAttDef& attr=attrIter.getAttDef(i);
> XMLAttDef::DefAttTypes ty = attr.getDefaultType();
> if(ty == XMLAttDef::Prohibited)
> continue;
> SchemaAttDef* pAttr=(SchemaAttDef*)&attr;
> if(pAttr->getAttName()->getURI()==qname.getURI())
> szName=pAttr->getFullName();
> else
> szName=getFullName(pAttr->getAttName());
> }
>}
>
>and this code has never failed.
>If this doesn't help you, can you send the entire testcase you are
>using (C++ files and schema)?
>
>Thanks,
>Alberto
>
>
> >Is there any way of extracting namespace/prefix information from
XMLAttDef?
> >
> >Many thanks for replying to me...
> >
> >Nicolas
> >
> >
> >-----Original Message-----
> >From: Alberto Massari [mailto:[EMAIL PROTECTED]
> >Sent: Thursday, March 02, 2006 11:08 AM
> >To: [email protected]
> >Subject: RE: Attribute namespace info through PSVI. Please help...!
> >
> >Hi Nicolas,
> >
> >At 02:50 PM 3/1/2006 +0200, Nicolas Tsokas wrote:
> > >Hi Alberto...
> > >
> > >Thanks indeed for your answer...
> > >
> > >Yes, I've tried getAttName()... And it always gives me a pointer to
> > >an invalid QName object. I mean qname->getPrefix(),
>qname->getLocalPart(),
> > >etc. they all cause an exception...
> >
> >That's strange, as I have used it successfully.
> >
> >
> > >Here's my code: (the previous part of the code is the one you posted
> > >on xerces-c mail archives on 02 Feb 2005)...
> > >
> > >ComplexTypeInfo* pComplexType =
>pSchemaTypes->get(typeKey.getRawBuffer());
> > >if (!pComplexType->hasAttDefs())
> > > return;
> > >
> > >SchemaAttDefList& attDefList =
> > > (SchemaAttDefList&)pComplexType->getAttDefList();
> > >unsigned int attCount = attDefList.getAttDefCount();
> > >for (unsigned int i=0; i<attCount; i++)
> > >{
> > > SchemaAttDef& attDef = (SchemaAttDef&)attDefList.getAttDef(i);
> > > attributes->add(attDef.getFullName());
> > > const QName* qnm = attDef.getAttName();
> > > const XMLCh* aaa = qnm->getPrefix();
> > >}
> >
> >Just to double check; can you remove the casts and work directly off
> >the virtual table (this is the code I have been using in my app)? Like
>this:
> >
> >XMLAttDefList& attDefList = pComplexType->getAttDefList();
> >unsigned int attCount = attDefList.getAttDefCount();
> >for (unsigned int i=0; i<attCount; i++)
> >{
> > XMLAttDef& attDef = attDefList.getAttDef(i);
> > attributes->add(attDef.getFullName());
> > const QName* qnm = attDef.getAttName();
> > const XMLCh* aaa = qnm->getPrefix();
> >}
> >
> >Hope this helps,
> >Alberto
> >
> > >Thanks again Alberto... I really appreciate your help.
> > >
> > >Nicolas
> > >
> > >
> > >
> > >
> > >-----Original Message-----
> > >From: Alberto Massari [mailto:[EMAIL PROTECTED]
> > >Sent: Wednesday, March 01, 2006 2:32 PM
> > >To: [email protected]
> > >Subject: Re: Attribute namespace info through PSVI. Please help...!
> > >
> > >Hi Nicolas,
> > >
> > >At 02:00 PM 3/1/2006 +0200, Nicolas Tsokas wrote:
> > > >Hi everyone,
> > > >
> > > >I'm trying to obtain info about an element using
> > > >PSVI (trying to resolve allowed children and attributes
> > > >for that specific element).
> > > >
> > > >I obtain a pointer to the corresponding
> > > >ComplexTypeInfo object which describes the element. Then I
> > > >get the names and namespaces of the allowed
> > > >children for that element by using ComplextTypeInfo's
> > > >elementAt(index) method and by obtaining
> > > >pointers to SchemaElementDecl objects.
> > > >
> > > >I have a problem with the attributes, though:
> > > >I get the list of attributes through
> > > >getAttDefList() method of the ComplexTypeInfo object.
> > > >Then I obtain a SchemaAttDef for each attribute.
> > > >SchemaAttDef gives the attribute's name
> > > >through its method getFullName(), but I cannot
> > > >figure out any way of finding their namespaces
> > > >(or namespace prefixes). Am I missing something?...
> > >
> > >Have you tried with SchemaAttDef::getAttName()?
> > >The QName* it returns should give you prefix, local name and namespace
>URI.
> > >
> > >Alberto
> > >
> > > >
> > > >Can anybody please help me?
> > > >
> > > >Thank you so much in advance.
> > > >
> > > >Nicolas
> > >
> > >
> > >---------------------------------------------------------------------
> > >To unsubscribe, e-mail: [EMAIL PROTECTED]
> > >For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> > >
> > >---------------------------------------------------------------------
> > >To unsubscribe, e-mail: [EMAIL PROTECTED]
> > >For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> >---------------------------------------------------------------------
> >To unsubscribe, e-mail: [EMAIL PROTECTED]
> >For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]