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]
