You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by tn...@apache.org on 2001/05/28 22:55:04 UTC

cvs commit: xml-xerces/c/src/internal XMLScanner.cpp XMLScanner.hpp XMLScanner2.cpp

tng         01/05/28 13:55:04

  Modified:    c/src/internal XMLScanner.cpp XMLScanner.hpp XMLScanner2.cpp
  Log:
  Schema: allocate a fDTDValidator, fSchemaValidator explicitly to avoid wrong cast
  
  Revision  Changes    Path
  1.41      +161 -79   xml-xerces/c/src/internal/XMLScanner.cpp
  
  Index: XMLScanner.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/internal/XMLScanner.cpp,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- XMLScanner.cpp	2001/05/23 20:36:54	1.40
  +++ XMLScanner.cpp	2001/05/28 20:55:02	1.41
  @@ -55,7 +55,7 @@
    */
   
   /*
  - * $Id: XMLScanner.cpp,v 1.40 2001/05/23 20:36:54 tng Exp $
  + * $Id: XMLScanner.cpp,v 1.41 2001/05/28 20:55:02 tng Exp $
    */
   
   
  @@ -172,6 +172,8 @@
       , fStandalone(false)
       , fValidate(false)
       , fValidator(valToAdopt)
  +    , fDTDValidator(0)
  +    , fSchemaValidator(0)
       , fValidatorFromUser(false)
       , fValScheme(Val_Never)
       , fDoSchema(false)
  @@ -190,8 +192,12 @@
   
      if (fValidator) {
          fValidatorFromUser = true;
  -       initValidator();
  +       initValidator(fValidator);
      }
  +   else {
  +       //use fDTDValidator as the default validator
  +       fValidator = fDTDValidator;
  +   }
   }
   
   XMLScanner::XMLScanner( XMLDocumentHandler* const  docHandler
  @@ -219,6 +225,8 @@
       , fStandalone(false)
       , fValidate(false)
       , fValidator(valToAdopt)
  +    , fDTDValidator(0)
  +    , fSchemaValidator(0)
       , fValidatorFromUser(false)
       , fValScheme(Val_Never)
       , fDoSchema(false)
  @@ -235,9 +243,13 @@
   {
      commonInit();
   
  -   if (fValidator){
  +   if (valToAdopt){
          fValidatorFromUser = true;
  -       initValidator();
  +       initValidator(fValidator);
  +   }
  +   else {
  +       //use fDTDValidator as the default validator
  +       fValidator = fDTDValidator;
      }
   }
   
  @@ -246,7 +258,12 @@
       delete fAttrList;
       delete fIDRefList;
       delete fRawAttrList;
  -    delete fValidator;
  +    if (fValidatorFromUser)
  +        delete fValidator;
  +
  +    delete fDTDValidator;
  +    delete fSchemaValidator;
  +
       delete fEntityDeclPool;
   
       //fGrammarResolver will delete the fGrammar as well
  @@ -860,25 +877,31 @@
       fGrammarResolver = new GrammarResolver();
   
       resetEntityDeclPool();
  +
  +    //  Create the Validator and init them
  +    fDTDValidator = new DTDValidator();
  +    initValidator(fDTDValidator);
  +    fSchemaValidator = new SchemaValidator();
  +    initValidator(fSchemaValidator);
   }
   
   
   
  -void XMLScanner::initValidator() {
  +void XMLScanner::initValidator(XMLValidator* theValidator) {
       //
       //  Tell the validator about the stuff it needs to know in order to
       //  do its work.
       //
  -    fValidator->setScannerInfo(this, &fReaderMgr, &fBufMgr);
  -    fValidator->setErrorReporter(fErrorReporter);
  +    theValidator->setScannerInfo(this, &fReaderMgr, &fBufMgr);
  +    theValidator->setErrorReporter(fErrorReporter);
   
       //  So lets ask the validator whether it requires namespaces or not. If it
       //  does, we have to override the namespace enablement flag.
  -    if (fValidator->requiresNamespaces() && !fDoNamespaces)
  +    if (theValidator->requiresNamespaces() && !fDoNamespaces)
           setDoNamespaces(true);
   
  -    if (fValidator->handlesSchema())
  -        ((SchemaValidator*) fValidator)->setGrammarResolver(fGrammarResolver);
  +    if (theValidator->handlesSchema())
  +        ((SchemaValidator*) theValidator)->setGrammarResolver(fGrammarResolver);
   }
   
   void XMLScanner::resetEntityDeclPool() {
  @@ -1683,15 +1706,23 @@
       if (gotData) {
           if (fDoNamespaces) {
               // Restore the grammar
  -            const ElemStack::StackElem* topElem2 = fElemStack.topElement();
  -            XMLBuffer bufURI;
  -            getURIText(topElem2->fThisElement->getURI(), bufURI);
  -            if (!switchGrammar(bufURI.getRawBuffer()) && fValidate)
  -                fValidator->emitError
  -                (
  -                    XMLValid::GrammarNotFound
  -                    , bufURI.getRawBuffer()
  -                );
  +            fGrammar = fElemStack.getCurrentGrammar();
  +            if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType && !fValidator->handlesSchema()) {
  +                if (fValidatorFromUser)
  +                    ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
  +                else {
  +                    fValidator = fSchemaValidator;
  +                }
  +            }
  +            else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType && !fValidator->handlesDTD()) {
  +                if (fValidatorFromUser)
  +                    ThrowXML(RuntimeException, XMLExcepts::Gen_NoDTDValidator);
  +                else {
  +                    fValidator = fDTDValidator;
  +                }
  +            }
  +
  +            fValidator->setGrammar(fGrammar);
           }
   
           // Restore the validation flag
  @@ -1967,6 +1998,11 @@
                   }
                    else if (fReaderMgr.skippedString(XMLUni::fgDocTypeString))
                   {
  +                    if (!fReuseGrammar && fValidatorFromUser && !fValidator->handlesDTD())
  +                    {
  +                        ThrowXML(RuntimeException, XMLExcepts::Gen_NoDTDValidator);
  +                    }
  +
                       //
                       //  We have a doc type. So, create a DTDScanner and
                       //  store the Grammar in DTDGrammar.
  @@ -2780,15 +2816,18 @@
       XMLElementDecl* elemDecl;
   
       if (uriId != fEmptyNamespaceId) {
  -        XMLBuffer bufURI;
  -        getURIText(uriId, bufURI);
  -        if (!switchGrammar(bufURI.getRawBuffer()) && fValidate && !laxThisOne)
  -        {
  -            fValidator->emitError
  -            (
  -                XMLValid::GrammarNotFound
  -                , bufURI.getRawBuffer()
  -            );
  +        if (fURIStringPool->getId(fGrammar->getTargetNamespace()) != uriId) {
  +            // switch grammar first
  +            XMLBuffer bufURI;
  +            getURIText(uriId, bufURI);
  +            if (!switchGrammar(bufURI.getRawBuffer()) && fValidate && !laxThisOne)
  +            {
  +                fValidator->emitError
  +                (
  +                    XMLValid::GrammarNotFound
  +                    , bufURI.getRawBuffer()
  +                );
  +            }
           }
           elemDecl = fGrammar->getElemDecl
                      (
  @@ -2797,17 +2836,39 @@
                       , fQNameBuf.getRawBuffer()
                       , currentScope
                       );
  +
           if (!elemDecl) {
  -            // if not found, then it may be a reference, try TOP_LEVEL_SCOPE
  -            elemDecl = fGrammar->findOrAddElemDecl
  -            (
  -                uriId
  -                , fNameBuf.getRawBuffer()
  -                , fPrefixBuf.getRawBuffer()
  -                , fQNameBuf.getRawBuffer()
  -                , Grammar::TOP_LEVEL_SCOPE
  -                , wasAdded
  -            );
  +            if (currentScope != Grammar::TOP_LEVEL_SCOPE) {
  +                // Not found in specified uri
  +                // try emptyNamesapce see if element should be un-qualified.
  +                elemDecl = fGrammar->getElemDecl
  +                           (
  +                               fEmptyNamespaceId
  +                               , fNameBuf.getRawBuffer()
  +                               , fQNameBuf.getRawBuffer()
  +                               , currentScope
  +                           );
  +            }
  +
  +            if (elemDecl) {
  +                fValidator->emitError
  +                (
  +                    XMLValid::ElementNotUnQualified
  +                    , elemDecl->getFullName()
  +                );
  +            }
  +            else {
  +                // if not found, then it may be a reference, try TOP_LEVEL_SCOPE
  +                elemDecl = fGrammar->findOrAddElemDecl
  +                (
  +                    uriId
  +                    , fNameBuf.getRawBuffer()
  +                    , fPrefixBuf.getRawBuffer()
  +                    , fQNameBuf.getRawBuffer()
  +                    , Grammar::TOP_LEVEL_SCOPE
  +                    , wasAdded
  +                );
  +            }
           }
       }
       else
  @@ -2815,6 +2876,8 @@
           //the element has no prefix,
           //thus it is either a non-qualified element defined in current targetNS
           //or an element that is defined in the globalNS
  +
  +        //try unqualifed first
           elemDecl = fGrammar->getElemDecl
                      (
                         uriId
  @@ -2824,46 +2887,56 @@
                       );
   
           if (!elemDecl) {
  -            // if not found, then it may be a reference, try TOP_LEVEL_SCOPE
  +            // Not found in specified uri
  +            // use target namespace URI id to see if element needs to be fully qualified.
               elemDecl = fGrammar->getElemDecl
                          (
  -                          uriId
  -                        , fNameBuf.getRawBuffer()
  -                        , fQNameBuf.getRawBuffer()
  -                        , Grammar::TOP_LEVEL_SCOPE
  -                        );
  -        }
  +                           fURIStringPool->getId(fGrammar->getTargetNamespace())
  +                           , fNameBuf.getRawBuffer()
  +                           , fQNameBuf.getRawBuffer()
  +                           , currentScope
  +                       );
   
  -        if (!elemDecl)
  -        {
  -            if (!switchGrammar(XMLUni::fgZeroLenString) && fValidate && !laxThisOne)
  -            {
  +            if (elemDecl) {
                   fValidator->emitError
                   (
  -                    XMLValid::GrammarNotFound
  -                    , XMLUni::fgZeroLenString
  +                    XMLValid::ElementNotQualified
  +                    , elemDecl->getFullName()
                   );
               }
  +            else {
  +                //still not found, now try globalNS
  +                if (fURIStringPool->getId(fGrammar->getTargetNamespace()) != fEmptyNamespaceId) {
  +                    if (!switchGrammar(XMLUni::fgZeroLenString) && fValidate && !laxThisOne)
  +                    {
  +                        fValidator->emitError
  +                        (
  +                            XMLValid::GrammarNotFound
  +                            , XMLUni::fgZeroLenString
  +                        );
  +                    }
  +                }
   
  -            elemDecl = fGrammar->getElemDecl
  -                       (
  -                          uriId
  +                elemDecl = fGrammar->getElemDecl
  +                           (
  +                              uriId
  +                            , fNameBuf.getRawBuffer()
  +                            , fQNameBuf.getRawBuffer()
  +                            , currentScope
  +                            );
  +
  +                if (!elemDecl) {
  +                    // if not found, then it may be a reference, try TOP_LEVEL_SCOPE
  +                    elemDecl = fGrammar->findOrAddElemDecl
  +                    (
  +                        uriId
                           , fNameBuf.getRawBuffer()
  +                        , fPrefixBuf.getRawBuffer()
                           , fQNameBuf.getRawBuffer()
  -                        , currentScope
  -                        );
  -
  -            if (!elemDecl) {
  -                // if not found, then it may be a reference, try TOP_LEVEL_SCOPE
  -                elemDecl = fGrammar->findOrAddElemDecl
  -                (
  -                    uriId
  -                    , fNameBuf.getRawBuffer()
  -                    , fPrefixBuf.getRawBuffer()
  -                    , fQNameBuf.getRawBuffer()
  -                    , Grammar::TOP_LEVEL_SCOPE
  -                    , wasAdded
  -                );
  +                        , Grammar::TOP_LEVEL_SCOPE
  +                        , wasAdded
  +                    );
  +                }
               }
           }
       }
  @@ -2926,6 +2999,7 @@
               currentScope = typeinfo->getScopeDefined();
           fElemStack.setCurrentScope(currentScope);
       }
  +    fElemStack.setCurrentGrammar(fGrammar);
   
       //
       //  If this is the first element and we are validating, check the root
  @@ -2997,16 +3071,24 @@
           else
           {
               // Restore the grammar
  -            const ElemStack::StackElem* topElem = fElemStack.topElement();
  -            XMLBuffer bufURI;
  -            getURIText(topElem->fThisElement->getURI(), bufURI);
  -            if (!switchGrammar(bufURI.getRawBuffer()) && fValidate)
  -                fValidator->emitError
  -                (
  -                    XMLValid::GrammarNotFound
  -                    , bufURI.getRawBuffer()
  -                );
  -         }
  +            fGrammar = fElemStack.getCurrentGrammar();
  +            if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType && !fValidator->handlesSchema()) {
  +                if (fValidatorFromUser)
  +                    ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
  +                else {
  +                    fValidator = fSchemaValidator;
  +                }
  +            }
  +            else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType && !fValidator->handlesDTD()) {
  +                if (fValidatorFromUser)
  +                    ThrowXML(RuntimeException, XMLExcepts::Gen_NoDTDValidator);
  +                else {
  +                    fValidator = fDTDValidator;
  +                }
  +            }
  +
  +            fValidator->setGrammar(fGrammar);
  +        }
       }
   
       // If we have a document handler, then tell it about this start tag
  
  
  
  1.19      +20 -13    xml-xerces/c/src/internal/XMLScanner.hpp
  
  Index: XMLScanner.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/internal/XMLScanner.hpp,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- XMLScanner.hpp	2001/05/11 15:17:28	1.18
  +++ XMLScanner.hpp	2001/05/28 20:55:02	1.19
  @@ -56,6 +56,9 @@
   
   /*
    * $Log: XMLScanner.hpp,v $
  + * Revision 1.19  2001/05/28 20:55:02  tng
  + * Schema: allocate a fDTDValidator, fSchemaValidator explicitly to avoid wrong cast
  + *
    * Revision 1.18  2001/05/11 15:17:28  tng
    * Schema: Nillable fixes.
    *
  @@ -326,16 +329,6 @@
       unsigned int getEmptyNamespaceId() const;
   
       /**
  -      * When namespaces are enabled, any elements whose names have no prefix
  -      * are mapped to a global namespace. This is the URL id for the URL
  -      * to which those names are mapped. It has no official standard text,
  -      * but the parser must use some id here.
  -      *
  -      * @return The URL pool id of the URL for the global namespace.
  -      */
  -    unsigned int getGlobalNamespaceId() const;
  -
  -    /**
         * When a prefix is found that has not been mapped, an error is issued.
         * However, if the parser has been instructed not to stop on the first
         * fatal error, it needs to be able to continue. To do so, it will map
  @@ -488,7 +481,7 @@
       //  Private helper methods
       // -----------------------------------------------------------------------
       void commonInit();
  -    void initValidator();
  +    void initValidator(XMLValidator* theValidator);
       void resetEntityDeclPool();
       void resetURIStringPool();
   
  @@ -691,6 +684,14 @@
       //  fValidator
       //      The installed validator. We look at them via the abstract
       //      validator interface, and don't know what it actual is.
  +    //      Either point to user's installed validator, or fDTDValidator
  +    //      or fSchemaValidator.
  +    //
  +    //  fDTDValidator
  +    //      The DTD validator instance.
  +    //
  +    //  fSchemaValidator
  +    //      The Schema validator instance.
       //
       //  fValidatorFromUser
       //      This flag indicates whether the validator was installed from
  @@ -778,6 +779,8 @@
       bool                        fStandalone;
       bool                        fValidate;
       XMLValidator*               fValidator;
  +    DTDValidator*               fDTDValidator;
  +    SchemaValidator*            fSchemaValidator;
       bool                        fValidatorFromUser;
       ValSchemes                  fValScheme;
       bool                        fDoSchema;
  @@ -991,6 +994,8 @@
   inline void XMLScanner::setErrorReporter(XMLErrorReporter* const errHandler)
   {
       fErrorReporter = errHandler;
  +    fDTDValidator->setErrorReporter(fErrorReporter);
  +    fSchemaValidator->setErrorReporter(fErrorReporter);
   }
   
   inline void XMLScanner::setErrorHandler(ErrorHandler* const handler)
  @@ -1033,9 +1038,11 @@
   
   inline void XMLScanner::setValidator(XMLValidator* const valToAdopt)
   {
  -    delete fValidator;
  +    if (fValidatorFromUser)
  +        delete fValidator;
       fValidator = valToAdopt;
  -    initValidator();
  +    fValidatorFromUser = true;
  +    initValidator(fValidator);
   }
   
   inline void XMLScanner::setDoSchema(const bool doSchema)
  
  
  
  1.32      +69 -53    xml-xerces/c/src/internal/XMLScanner2.cpp
  
  Index: XMLScanner2.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/internal/XMLScanner2.cpp,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- XMLScanner2.cpp	2001/05/16 14:32:32	1.31
  +++ XMLScanner2.cpp	2001/05/28 20:55:02	1.32
  @@ -55,7 +55,7 @@
    */
   
   /*
  - * $Id: XMLScanner2.cpp,v 1.31 2001/05/16 14:32:32 tng Exp $
  + * $Id: XMLScanner2.cpp,v 1.32 2001/05/28 20:55:02 tng Exp $
    */
   
   
  @@ -740,48 +740,44 @@
           if (fDoNamespaces)
               resetURIStringPool();
   
  -        // create a default validator
  -        if (fValidate) {
  -            if (!fValidator)
  -                setValidator(new DTDValidator());
  +        // create a default grammar first
  +        if (fValidatorFromUser) {
  +            if (fValidator->handlesDTD()) {
  +                fGrammar = new DTDGrammar();
  +            }
  +            else {
  +                fGrammar = new SchemaGrammar();
  +            }
  +        }
  +        else {
  +            // set fValidator as fDTDValidator
  +            fValidator = fDTDValidator;
  +            fGrammar = new DTDGrammar();
           }
   
  -        // create a default grammar first
  -        fGrammar = new DTDGrammar();
           fGrammarResolver->putGrammar(XMLUni::fgZeroLenString, fGrammar);
  -
  -        if (fValidator)
  -            fValidator->setGrammar(fGrammar);
  -
  +        fValidator->setGrammar(fGrammar);
       }
       else {
           // reusing grammar, thus the fGrammar must pre-exist already
  -        // if validating, make sure the validator handles this reuse grammar type
  -        if (fValidate) {
  -            if (fValidator) {
  -                if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType && !fValidator->handlesSchema()) {
  -                    if (fValidatorFromUser)
  -                        ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
  -                    else
  -                        setValidator(new SchemaValidator());
  -                }
  -                else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType && !fValidator->handlesDTD()) {
  -                    if (fValidatorFromUser)
  -                        ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
  -                    else
  -                        setValidator(new DTDValidator());
  -                }
  +        // make sure the validator handles this reuse grammar type
  +        if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType && !fValidator->handlesSchema()) {
  +            if (fValidatorFromUser)
  +                ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
  +            else {
  +                fValidator = fSchemaValidator;
               }
  +        }
  +        else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType && !fValidator->handlesDTD()) {
  +            if (fValidatorFromUser)
  +                ThrowXML(RuntimeException, XMLExcepts::Gen_NoDTDValidator);
               else {
  -                if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType)
  -                    setValidator(new SchemaValidator());
  -                else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType)
  -                    setValidator(new DTDValidator());
  +                fValidator = fDTDValidator;
               }
  -
  -            if (!fValidator->getGrammar())
  -                fValidator->setGrammar(fGrammar);
           }
  +
  +        if (!fValidator->getGrammar())
  +            fValidator->setGrammar(fGrammar);
       }
   
   
  @@ -1181,22 +1177,15 @@
           fElemStack.setValidationFlag(fValidate);
       }
   
  -    // set up the SchemaValidator if validating
  -    if(fValidate) {
  -        if (fValidator) {
  -            if (!fValidator->handlesSchema())
  -            {
  -                // the fValidator is from user
  -                if (fValidatorFromUser)
  -                    ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
  -                else {
  -                    // the fValidator is created by the Scanner, replace it with a SchemaValidator
  -                    setValidator(new SchemaValidator());
  -                }
  -            }
  +    // we have seen a schema, so set up the fValidator as fSchemaValidator
  +    if (!fValidator->handlesSchema())
  +    {
  +        if (fValidatorFromUser) {
  +            // the fValidator is from user
  +            ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
           }
           else {
  -            setValidator(new SchemaValidator());
  +            fValidator = fSchemaValidator;
           }
       }
   
  @@ -1307,8 +1296,7 @@
           }
       }
       fGrammar = grammar;
  -    if (fValidate)
  -        fValidator->setGrammar(fGrammar);
  +    fValidator->setGrammar(fGrammar);
   }
   
   // ---------------------------------------------------------------------------
  @@ -2557,8 +2545,22 @@
           return false;
       else {
           fGrammar = tempGrammar;
  -        if (fValidator)
  -            fValidator->setGrammar(fGrammar);
  +        if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType && !fValidator->handlesSchema()) {
  +            if (fValidatorFromUser)
  +                ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
  +            else {
  +                fValidator = fSchemaValidator;
  +            }
  +        }
  +        else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType && !fValidator->handlesDTD()) {
  +            if (fValidatorFromUser)
  +                ThrowXML(RuntimeException, XMLExcepts::Gen_NoDTDValidator);
  +            else {
  +                fValidator = fDTDValidator;
  +            }
  +        }
  +
  +        fValidator->setGrammar(fGrammar);
           return true;
       }
   }
  @@ -2574,8 +2576,22 @@
           return false;
       else {
           fGrammar = tempGrammar;
  -        if (fValidator)
  -            fValidator->setGrammar(fGrammar);
  +        if (fGrammar->getGrammarType() == Grammar::SchemaGrammarType && !fValidator->handlesSchema()) {
  +            if (fValidatorFromUser)
  +                ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
  +            else {
  +                fValidator = fSchemaValidator;
  +            }
  +        }
  +        else if (fGrammar->getGrammarType() == Grammar::DTDGrammarType && !fValidator->handlesDTD()) {
  +            if (fValidatorFromUser)
  +                ThrowXML(RuntimeException, XMLExcepts::Gen_NoDTDValidator);
  +            else {
  +                fValidator = fDTDValidator;
  +            }
  +        }
  +
  +        fValidator->setGrammar(fGrammar);
           return true;
       }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org