[Libreoffice-commits] core.git: include/xmloff xmloff/source

Noel (via logerrit) logerrit at kemper.freedesktop.org
Mon Nov 30 11:10:32 UTC 2020


 include/xmloff/shapeimport.hxx                             |    2 
 xmloff/source/chart/SchXMLChartContext.cxx                 |    2 
 xmloff/source/chart/SchXMLPlotAreaContext.cxx              |  254 ++++++-------
 xmloff/source/chart/SchXMLPlotAreaContext.hxx              |   24 -
 xmloff/source/chart/SchXMLPropertyMappingContext.cxx       |   27 -
 xmloff/source/chart/SchXMLPropertyMappingContext.hxx       |    6 
 xmloff/source/chart/SchXMLRegressionCurveObjectContext.cxx |   53 +-
 xmloff/source/chart/SchXMLRegressionCurveObjectContext.hxx |    7 
 xmloff/source/chart/SchXMLSeries2Context.cxx               |   33 -
 xmloff/source/chart/SchXMLSeries2Context.hxx               |    4 
 xmloff/source/chart/SchXMLTableContext.cxx                 |  107 ++---
 xmloff/source/chart/SchXMLTableContext.hxx                 |   28 -
 xmloff/source/draw/ximp3dobject.cxx                        |   36 +
 xmloff/source/draw/ximp3dobject.hxx                        |   24 -
 xmloff/source/draw/ximp3dscene.cxx                         |  186 ++++-----
 xmloff/source/draw/ximp3dscene.hxx                         |    6 
 xmloff/source/draw/ximpgrp.cxx                             |    3 
 xmloff/source/draw/ximpgrp.hxx                             |    4 
 xmloff/source/draw/ximpshap.cxx                            |  106 +++--
 xmloff/source/draw/ximpshap.hxx                            |   84 +++-
 20 files changed, 529 insertions(+), 467 deletions(-)

New commits:
commit d05a4cfbdcece491f7385dbeaa7eca03f2fdc1d5
Author:     Noel <noelgrandin at gmail.com>
AuthorDate: Mon Nov 30 10:52:22 2020 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Mon Nov 30 12:09:54 2020 +0100

    fastparser in shapeimport
    
    Change-Id: I11227424647313ff5c5d54126bdc27a17da3932e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106851
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/include/xmloff/shapeimport.hxx b/include/xmloff/shapeimport.hxx
index b4bc6bf44c3a..dacd947a66d2 100644
--- a/include/xmloff/shapeimport.hxx
+++ b/include/xmloff/shapeimport.hxx
@@ -186,7 +186,7 @@ public:
     SvXMLImportContext * create3DLightContext( const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList);
 
     /** this should be called for each scene attribute */
-    void processSceneAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue );
+    void processSceneAttribute( sal_Int32 nAttributeToken, const OUString& rValue );
 
     /** this sets the scene attributes at this propertyset */
     void setSceneAttributes( const css::uno::Reference< css::beans::XPropertySet >& xPropSet );
diff --git a/xmloff/source/chart/SchXMLChartContext.cxx b/xmloff/source/chart/SchXMLChartContext.cxx
index 968bf0cfa76a..02c4df000d36 100644
--- a/xmloff/source/chart/SchXMLChartContext.cxx
+++ b/xmloff/source/chart/SchXMLChartContext.cxx
@@ -1073,7 +1073,7 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > SchXMLChartContext::cr
         case  XML_ELEMENT(TABLE, XML_TABLE):
             {
                 SchXMLTableContext * pTableContext =
-                    new SchXMLTableContext( mrImportHelper, GetImport(), maTable );
+                    new SchXMLTableContext( GetImport(), maTable );
                 m_bHasTableElement = true;
                 // #i85913# take into account column- and row- mapping for
                 // charts with own data only for those which were not copied
diff --git a/xmloff/source/chart/SchXMLPlotAreaContext.cxx b/xmloff/source/chart/SchXMLPlotAreaContext.cxx
index 0391b4f4a8d3..2fe188eab45f 100644
--- a/xmloff/source/chart/SchXMLPlotAreaContext.cxx
+++ b/xmloff/source/chart/SchXMLPlotAreaContext.cxx
@@ -206,37 +206,32 @@ SchXMLPlotAreaContext::SchXMLPlotAreaContext(
 SchXMLPlotAreaContext::~SchXMLPlotAreaContext()
 {}
 
-void SchXMLPlotAreaContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+void SchXMLPlotAreaContext::startFastElement (sal_Int32 /*nElement*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // parse attributes
-    sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
-    const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetPlotAreaAttrTokenMap();
     uno::Reference< chart2::XChartDocument > xNewDoc( GetImport().GetModel(), uno::UNO_QUERY );
 
-    for( sal_Int16 i = 0; i < nAttrCount; i++ )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
-        OUString sAttrName = xAttrList->getNameByIndex( i );
-        OUString aLocalName;
-        OUString aValue = xAttrList->getValueByIndex( i );
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
-
-        switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
+        OUString aValue = aIter.toString();
+        switch( aIter.getToken() )
         {
-            case XML_TOK_PA_X:
-            case XML_TOK_PA_Y:
-            case XML_TOK_PA_WIDTH:
-            case XML_TOK_PA_HEIGHT:
-                m_aOuterPositioning.readPositioningAttribute( nPrefix, aLocalName, aValue );
+            case XML_ELEMENT(SVG, XML_X):
+            case XML_ELEMENT(SVG, XML_Y):
+            case XML_ELEMENT(SVG, XML_WIDTH):
+            case XML_ELEMENT(SVG, XML_HEIGHT):
+                m_aOuterPositioning.readPositioningAttribute( aIter.getToken(), aValue );
                 break;
-            case XML_TOK_PA_STYLE_NAME:
+            case XML_ELEMENT(CHART, XML_STYLE_NAME):
                 msAutoStyleName = aValue;
                 break;
-            case XML_TOK_PA_CHART_ADDRESS:
+            case XML_ELEMENT(TABLE, XML_CELL_RANGE_ADDRESS):
                 mrChartAddress = lcl_ConvertRange( aValue, xNewDoc );
                 // indicator for getting data from the outside
                 m_rbHasRangeAtPlotArea = true;
                 break;
-            case XML_TOK_PA_DS_HAS_LABELS:
+            case XML_ELEMENT(CHART, XML_DATA_SOURCE_HAS_LABELS):
                 {
                     if( aValue == ::xmloff::token::GetXMLToken( ::xmloff::token::XML_BOTH ))
                         mrColHasLabels = mrRowHasLabels = true;
@@ -246,19 +241,21 @@ void SchXMLPlotAreaContext::StartElement( const uno::Reference< xml::sax::XAttri
                         mrColHasLabels = true;
                 }
                 break;
-            case XML_TOK_PA_TRANSFORM:
-            case XML_TOK_PA_VRP:
-            case XML_TOK_PA_VPN:
-            case XML_TOK_PA_VUP:
-            case XML_TOK_PA_PROJECTION:
-            case XML_TOK_PA_DISTANCE:
-            case XML_TOK_PA_FOCAL_LENGTH:
-            case XML_TOK_PA_SHADOW_SLANT:
-            case XML_TOK_PA_SHADE_MODE:
-            case XML_TOK_PA_AMBIENT_COLOR:
-            case XML_TOK_PA_LIGHTING_MODE:
-                maSceneImportHelper.processSceneAttribute( nPrefix, aLocalName, aValue );
+            case XML_ELEMENT(DR3D, XML_TRANSFORM):
+            case XML_ELEMENT(DR3D, XML_VRP):
+            case XML_ELEMENT(DR3D, XML_VPN):
+            case XML_ELEMENT(DR3D, XML_VUP):
+            case XML_ELEMENT(DR3D, XML_PROJECTION):
+            case XML_ELEMENT(DR3D, XML_DISTANCE):
+            case XML_ELEMENT(DR3D, XML_FOCAL_LENGTH):
+            case XML_ELEMENT(DR3D, XML_SHADOW_SLANT):
+            case XML_ELEMENT(DR3D, XML_SHADE_MODE):
+            case XML_ELEMENT(DR3D, XML_AMBIENT_COLOR):
+            case XML_ELEMENT(DR3D, XML_LIGHTING_MODE):
+                maSceneImportHelper.processSceneAttribute( aIter.getToken(), aValue );
                 break;
+            default:
+                XMLOFF_WARN_UNKNOWN("xmloff", aIter);
         }
     }
 
@@ -709,46 +706,43 @@ SchXMLDataPointContext::~SchXMLDataPointContext()
 {
 }
 
-void SchXMLDataPointContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+void SchXMLDataPointContext::startFastElement (sal_Int32 /*Element*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
-    sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
     OUString sAutoStyleName;
     sal_Int32 nRepeat = 1;
     OUString sCustomLabelField;
 
-    for( sal_Int16 i = 0; i < nAttrCount; i++ )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
-        OUString sAttrName = xAttrList->getNameByIndex( i );
-        OUString aLocalName;
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
-
-        if( nPrefix == XML_NAMESPACE_CHART )
+        switch (aIter.getToken())
         {
-            if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
+            case XML_ELEMENT(CHART, XML_STYLE_NAME):
             {
-                sAutoStyleName = xAttrList->getValueByIndex( i );
+                sAutoStyleName = aIter.toString();
                 mDataPoint.msStyleName = sAutoStyleName;
                 mDataLabel.msStyleNameOfParent = sAutoStyleName;
+                break;
             }
-            else if( IsXMLToken( aLocalName, XML_REPEATED ) )
+            case XML_ELEMENT(CHART, XML_REPEATED):
             {
-                nRepeat = xAttrList->getValueByIndex( i ).toInt32();
+                nRepeat = aIter.toInt32();
                 mDataPoint.m_nPointRepeat = nRepeat;
                 mDataLabel.m_nPointRepeat = nRepeat;
+                break;
             }
-        }
-        else if( nPrefix == XML_NAMESPACE_LO_EXT)
-        {
             // Deprecated. New documents use the chart:data-label element
             // instead in order to store custom label text.
-            if( IsXMLToken( aLocalName, XML_CUSTOM_LABEL_FIELD) && !mbHasLabelParagraph)
-            {
-                sCustomLabelField = xAttrList->getValueByIndex( i );
-                mDataPoint.mCustomLabels.push_back(sCustomLabelField);
-            }
-            else if (IsXMLToken(aLocalName, XML_HIDE_LEGEND))
+            case XML_ELEMENT(LO_EXT, XML_CUSTOM_LABEL_FIELD):
+             if (!mbHasLabelParagraph)
+                {
+                    sCustomLabelField = aIter.toString();
+                    mDataPoint.mCustomLabels.push_back(sCustomLabelField);
+                }
+                break;
+            case XML_ELEMENT(LO_EXT, XML_HIDE_LEGEND):
             {
-                bool bHideLegend = xAttrList->getValueByIndex(i).toBoolean();
+                bool bHideLegend = aIter.toString().toBoolean();
                 if (bHideLegend)
                 {
                     uno::Sequence<sal_Int32> deletedLegendEntriesSeq;
@@ -762,15 +756,20 @@ void SchXMLDataPointContext::StartElement( const uno::Reference< xml::sax::XAttr
                     deletedLegendEntries.push_back(mDataPoint.m_nPointIndex);
                     xSeriesProp->setPropertyValue("DeletedLegendEntries", uno::makeAny(::oox::ContainerHelper::vectorToSequence(deletedLegendEntries)));
                 }
+                break;
             }
-            else if( IsXMLToken(aLocalName, XML_CUSTOM_LABEL_POS_X ) )
+            case XML_ELEMENT(LO_EXT, XML_CUSTOM_LABEL_POS_X):
             {
-                mDataPoint.mCustomLabelPos[0] = xAttrList->getValueByIndex(i).toDouble();
+                mDataPoint.mCustomLabelPos[0] = aIter.toDouble();
+                break;
             }
-            else if( IsXMLToken(aLocalName, XML_CUSTOM_LABEL_POS_Y) )
+            case XML_ELEMENT(LO_EXT, XML_CUSTOM_LABEL_POS_Y):
             {
-                mDataPoint.mCustomLabelPos[1] = xAttrList->getValueByIndex(i).toDouble();
+                mDataPoint.mCustomLabelPos[1] = aIter.toDouble();
+                break;
             }
+            default:
+                XMLOFF_WARN_UNKNOWN("xmloff", aIter);
         }
     }
 
@@ -817,34 +816,43 @@ bool SchXMLPositionAttributesHelper::isAutomatic() const
     return m_bAutoSize || m_bAutoPosition;
 }
 
-void SchXMLPositionAttributesHelper::readPositioningAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, std::u16string_view rValue )
+void SchXMLPositionAttributesHelper::readPositioningAttribute( sal_Int32 nAttributeToken, std::u16string_view rValue )
 {
-    if( XML_NAMESPACE_SVG != nPrefix )
+    if( !IsTokenInNamespace(nAttributeToken, XML_NAMESPACE_SVG) && !IsTokenInNamespace(nAttributeToken, XML_NAMESPACE_SVG_COMPAT) )
         return;
 
-    if( IsXMLToken( rLocalName, XML_X ) )
-    {
-        m_rImport.GetMM100UnitConverter().convertMeasureToCore(
-                m_aPosition.X, rValue );
-        m_bHasPositionX = true;
-    }
-    else if( IsXMLToken( rLocalName, XML_Y ) )
+    switch (nAttributeToken & TOKEN_MASK)
     {
-        m_rImport.GetMM100UnitConverter().convertMeasureToCore(
-                m_aPosition.Y, rValue );
-        m_bHasPositionY = true;
-    }
-    else if( IsXMLToken( rLocalName, XML_WIDTH ) )
-    {
-        m_rImport.GetMM100UnitConverter().convertMeasureToCore(
-                m_aSize.Width, rValue );
-        m_bHasSizeWidth = true;
-    }
-    else if( IsXMLToken( rLocalName, XML_HEIGHT ) )
-    {
-        m_rImport.GetMM100UnitConverter().convertMeasureToCore(
-                m_aSize.Height, rValue );
-        m_bHasSizeHeight = true;
+        case XML_X:
+        {
+            m_rImport.GetMM100UnitConverter().convertMeasureToCore(
+                    m_aPosition.X, rValue );
+            m_bHasPositionX = true;
+            break;
+        }
+        case XML_Y:
+        {
+            m_rImport.GetMM100UnitConverter().convertMeasureToCore(
+                    m_aPosition.Y, rValue );
+            m_bHasPositionY = true;
+            break;
+        }
+        case XML_WIDTH:
+        {
+            m_rImport.GetMM100UnitConverter().convertMeasureToCore(
+                    m_aSize.Width, rValue );
+            m_bHasSizeWidth = true;
+            break;
+        }
+        case XML_HEIGHT:
+        {
+            m_rImport.GetMM100UnitConverter().convertMeasureToCore(
+                    m_aSize.Height, rValue );
+            m_bHasSizeHeight = true;
+            break;
+        }
+        default:
+            XMLOFF_WARN_UNKNOWN_ATTR("xmloff", nAttributeToken, OUString(rValue));
     }
 }
 
@@ -872,19 +880,12 @@ SchXMLCoordinateRegionContext::~SchXMLCoordinateRegionContext()
 {
 }
 
-void SchXMLCoordinateRegionContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+void SchXMLCoordinateRegionContext::startFastElement (sal_Int32 /*Element*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // parse attributes
-    sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
-
-    for( sal_Int16 i = 0; i < nAttrCount; i++ )
-    {
-        OUString sAttrName = xAttrList->getNameByIndex( i );
-        OUString aLocalName;
-        OUString aValue = xAttrList->getValueByIndex( i );
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
-        m_rPositioning.readPositioningAttribute( nPrefix, aLocalName, aValue );
-    }
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
+        m_rPositioning.readPositioningAttribute( aIter.getToken(), aIter.toString() );
 }
 
 SchXMLWallFloorContext::SchXMLWallFloorContext(
@@ -903,25 +904,20 @@ SchXMLWallFloorContext::~SchXMLWallFloorContext()
 {
 }
 
-void SchXMLWallFloorContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+void SchXMLWallFloorContext::startFastElement (sal_Int32 /*Element*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     if( !mxWallFloorSupplier.is())
         return;
 
-    sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
     OUString sAutoStyleName;
 
-    for( sal_Int16 i = 0; i < nAttrCount; i++ )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
-        OUString sAttrName = xAttrList->getNameByIndex( i );
-        OUString aLocalName;
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
-
-        if( nPrefix == XML_NAMESPACE_CHART &&
-            IsXMLToken( aLocalName, XML_STYLE_NAME ) )
-        {
-            sAutoStyleName = xAttrList->getValueByIndex( i );
-        }
+        if( aIter.getToken() == XML_ELEMENT(CHART, XML_STYLE_NAME) )
+            sAutoStyleName = aIter.toString();
+        else
+            XMLOFF_WARN_UNKNOWN("xmloff", aIter);
     }
 
     // set properties
@@ -949,25 +945,20 @@ SchXMLStockContext::~SchXMLStockContext()
 {
 }
 
-void SchXMLStockContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+void SchXMLStockContext::startFastElement (sal_Int32 /*Element*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     if( !mxStockPropProvider.is())
         return;
 
-    sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
     OUString sAutoStyleName;
 
-    for( sal_Int16 i = 0; i < nAttrCount; i++ )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
-        OUString sAttrName = xAttrList->getNameByIndex( i );
-        OUString aLocalName;
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
-
-        if( nPrefix == XML_NAMESPACE_CHART &&
-            IsXMLToken( aLocalName, XML_STYLE_NAME ) )
-        {
-            sAutoStyleName = xAttrList->getValueByIndex( i );
-        }
+        if( aIter.getToken() == XML_ELEMENT(CHART, XML_STYLE_NAME) )
+            sAutoStyleName = aIter.toString();
+        else
+            XMLOFF_WARN_UNKNOWN("xmloff", aIter);
     }
 
     if( sAutoStyleName.isEmpty())
@@ -1199,31 +1190,30 @@ void SetErrorBarPropertiesFromStyleName( const OUString& aStyleName, const uno::
 
 }
 
-void SchXMLStatisticsObjectContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+void SchXMLStatisticsObjectContext::startFastElement (sal_Int32 /*Element*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
-    sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
     OUString sAutoStyleName;
     OUString aPosRange;
     OUString aNegRange;
     bool bYError = true;    /// Default errorbar, to be backward compatible with older files!
 
-    for( sal_Int16 i = 0; i < nAttrCount; i++ )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
-        OUString sAttrName = xAttrList->getNameByIndex( i );
-        OUString aLocalName;
-
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
-
-        if( nPrefix == XML_NAMESPACE_CHART )
+        switch (aIter.getToken())
         {
-            if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
-                sAutoStyleName = xAttrList->getValueByIndex( i );
-            else if( IsXMLToken( aLocalName, XML_DIMENSION ) )
-                bYError = xAttrList->getValueByIndex(i) == "y";
-            else if( IsXMLToken( aLocalName, XML_ERROR_UPPER_RANGE) )
-                aPosRange = xAttrList->getValueByIndex(i);
-            else if( IsXMLToken( aLocalName, XML_ERROR_LOWER_RANGE) )
-                aNegRange = xAttrList->getValueByIndex(i);
+            case XML_ELEMENT(CHART, XML_STYLE_NAME):
+                sAutoStyleName = aIter.toString();
+                break;
+            case XML_ELEMENT(CHART, XML_DIMENSION):
+                bYError = aIter.toString() == "y";
+                break;
+            case XML_ELEMENT(CHART, XML_ERROR_UPPER_RANGE):
+                aPosRange = aIter.toString();
+                break;
+            case XML_ELEMENT(CHART, XML_ERROR_LOWER_RANGE):
+                aNegRange = aIter.toString();
+                break;
         }
     }
 
diff --git a/xmloff/source/chart/SchXMLPlotAreaContext.hxx b/xmloff/source/chart/SchXMLPlotAreaContext.hxx
index 750eacb25ce7..ef5f840cc1a2 100644
--- a/xmloff/source/chart/SchXMLPlotAreaContext.hxx
+++ b/xmloff/source/chart/SchXMLPlotAreaContext.hxx
@@ -60,7 +60,7 @@ public:
     explicit SchXMLPositionAttributesHelper( SvXMLImport& rImporter );
     ~SchXMLPositionAttributesHelper();
 
-    void readPositioningAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, std::u16string_view rValue );
+    void readPositioningAttribute( sal_Int32 nAttributeToken, std::u16string_view rValue );
     void readAutomaticPositioningProperties( XMLPropStyleContext const * pPropStyleContext, const SvXMLStylesContext* pStylesCtxt );
 
     bool hasPosSize() const;
@@ -100,10 +100,12 @@ public:
                            const css::awt::Size & rChartSize );
     virtual ~SchXMLPlotAreaContext() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
     virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
         sal_Int32 nElement,
         const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
 private:
@@ -194,11 +196,12 @@ public:
                              bool bSymbolSizeForSeriesIsMissingInFile );
     virtual ~SchXMLDataPointContext() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
-
     virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
         sal_Int32 nElement,
         const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 };
 
@@ -209,7 +212,9 @@ public:
             SvXMLImport& rImport
             , SchXMLPositionAttributesHelper& rPositioning );
     virtual ~SchXMLCoordinateRegionContext() override;
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
 private:
     SchXMLPositionAttributesHelper& m_rPositioning;
@@ -235,7 +240,8 @@ public:
                             css::uno::Reference< css::chart::XDiagram > const & xDiagram,
                             ContextType eContextType );
     virtual ~SchXMLWallFloorContext() override;
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement (sal_Int32 Element,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& Attribs) override;
 };
 
 class SchXMLStockContext : public SvXMLImportContext
@@ -259,7 +265,8 @@ public:
                         css::uno::Reference< css::chart::XDiagram > const & xDiagram,
                         ContextType eContextType );
     virtual ~SchXMLStockContext() override;
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement (sal_Int32 Element,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& Attribs) override;
 };
 
 class SchXMLStatisticsObjectContext : public SvXMLImportContext
@@ -282,7 +289,8 @@ public:
 
     virtual ~SchXMLStatisticsObjectContext() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement (sal_Int32 Element,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& Attribs) override;
 
 private:
     SchXMLImportHelper &                           mrImportHelper;
diff --git a/xmloff/source/chart/SchXMLPropertyMappingContext.cxx b/xmloff/source/chart/SchXMLPropertyMappingContext.cxx
index 8303d5bd660f..29810fd185d4 100644
--- a/xmloff/source/chart/SchXMLPropertyMappingContext.cxx
+++ b/xmloff/source/chart/SchXMLPropertyMappingContext.cxx
@@ -13,6 +13,7 @@
 #include <xmloff/xmlimp.hxx>
 #include <xmloff/namespacemap.hxx>
 #include <SchXMLImport.hxx>
+#include <sal/log.hxx>
 
 #include <com/sun/star/chart2/data/XLabeledDataSequence2.hpp>
 #include <com/sun/star/chart2/data/XDataSource.hpp>
@@ -21,6 +22,7 @@
 
 using namespace com::sun::star;
 using namespace com::sun::star::uno;
+using namespace ::xmloff::token;
 
 namespace {
 
@@ -60,13 +62,12 @@ Reference< chart2::data::XLabeledDataSequence2 > createAndAddSequenceToSeries( c
 
 }
 
-SchXMLPropertyMappingContext::SchXMLPropertyMappingContext( SchXMLImportHelper& rImpHelper,
+SchXMLPropertyMappingContext::SchXMLPropertyMappingContext(
         SvXMLImport& rImport,
         tSchXMLLSequencesPerIndex & rLSequencesPerIndex,
         uno::Reference<
         chart2::XDataSeries > const & xSeries ):
     SvXMLImportContext( rImport ),
-    mrImportHelper( rImpHelper ),
     mxDataSeries(xSeries),
     mrLSequencesPerIndex(rLSequencesPerIndex)
 {
@@ -77,29 +78,25 @@ SchXMLPropertyMappingContext::~SchXMLPropertyMappingContext()
 {
 }
 
-void SchXMLPropertyMappingContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList )
+void SchXMLPropertyMappingContext::startFastElement (sal_Int32 /*nElement*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     OUString aRange;
     OUString aRole;
     // parse attributes
-    sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
-    const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetPropMappingAttrTokenMap();
-
-    for( sal_Int16 i = 0; i < nAttrCount; i++ )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
-        OUString sAttrName = xAttrList->getNameByIndex( i );
-        OUString aLocalName;
-        OUString aValue = xAttrList->getValueByIndex( i );
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
-
-        switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
+        OUString aValue = aIter.toString();
+        switch( aIter.getToken() )
         {
-            case XML_TOK_PROPERTY_MAPPING_PROPERTY:
+            case XML_ELEMENT(LO_EXT, XML_PROPERTY):
                 aRole = aValue;
                 break;
-            case XML_TOK_PROPERTY_MAPPING_RANGE:
+            case XML_ELEMENT(LO_EXT, XML_CELL_RANGE_ADDRESS):
                 aRange = aValue;
                 break;
+            default:
+                XMLOFF_WARN_UNKNOWN("xmloff", aIter);
         }
     }
 
diff --git a/xmloff/source/chart/SchXMLPropertyMappingContext.hxx b/xmloff/source/chart/SchXMLPropertyMappingContext.hxx
index 31ae90d3dd3e..41154d344d4c 100644
--- a/xmloff/source/chart/SchXMLPropertyMappingContext.hxx
+++ b/xmloff/source/chart/SchXMLPropertyMappingContext.hxx
@@ -25,7 +25,7 @@ class SchXMLPropertyMappingContext : public SvXMLImportContext
 {
 public:
 
-    SchXMLPropertyMappingContext( SchXMLImportHelper& rImpHelper,
+    SchXMLPropertyMappingContext(
                           SvXMLImport& rImport,
                           tSchXMLLSequencesPerIndex& rLSequencesPerIndex,
                               css::uno::Reference<
@@ -33,10 +33,10 @@ public:
 
     virtual ~SchXMLPropertyMappingContext() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement (sal_Int32 Element,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& Attribs) override;
 private:
 
-    SchXMLImportHelper& mrImportHelper;
     css::uno::Reference< css::chart2::XDataSeries > mxDataSeries;
 
     tSchXMLLSequencesPerIndex& mrLSequencesPerIndex;
diff --git a/xmloff/source/chart/SchXMLRegressionCurveObjectContext.cxx b/xmloff/source/chart/SchXMLRegressionCurveObjectContext.cxx
index ec9253a74058..fcb95607b6aa 100644
--- a/xmloff/source/chart/SchXMLRegressionCurveObjectContext.cxx
+++ b/xmloff/source/chart/SchXMLRegressionCurveObjectContext.cxx
@@ -59,25 +59,16 @@ SchXMLRegressionCurveObjectContext::~SchXMLRegressionCurveObjectContext()
 {
 }
 
-void SchXMLRegressionCurveObjectContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttributeList )
+void SchXMLRegressionCurveObjectContext::startFastElement (sal_Int32 /*nElement*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
-    sal_Int16 nAttributeCount = xAttributeList.is()? xAttributeList->getLength(): 0;
     OUString sAutoStyleName;
-
-    for( sal_Int16 i = 0; i < nAttributeCount; i++ )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
-        OUString sAttributeName = xAttributeList->getNameByIndex( i );
-        OUString aLocalName;
-
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttributeName, &aLocalName );
-
-        if( nPrefix == XML_NAMESPACE_CHART )
-        {
-            if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
-            {
-                sAutoStyleName = xAttributeList->getValueByIndex( i );
-            }
-        }
+        if (aIter.getToken() == XML_ELEMENT(CHART, XML_STYLE_NAME) )
+            sAutoStyleName = aIter.toString();
+        else
+            XMLOFF_WARN_UNKNOWN("xmloff", aIter);
     }
 
     RegressionStyle aStyle( mxSeries, sAutoStyleName );
@@ -112,48 +103,46 @@ SchXMLEquationContext::SchXMLEquationContext(
 SchXMLEquationContext::~SchXMLEquationContext()
 {}
 
-void SchXMLEquationContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+void SchXMLEquationContext::startFastElement (sal_Int32 /*nElement*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // parse attributes
-    sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
     SchXMLImport& rImport = static_cast< SchXMLImport& >(GetImport());
-    const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetRegEquationAttrTokenMap();
     OUString sAutoStyleName;
-
     bool bShowEquation = true;
     bool bShowRSquare = false;
     awt::Point aPosition;
     bool bHasXPos = false;
     bool bHasYPos = false;
 
-    for( sal_Int16 i = 0; i < nAttrCount; i++ )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
-        OUString sAttrName = xAttrList->getNameByIndex( i );
-        OUString aLocalName;
-        OUString aValue = xAttrList->getValueByIndex( i );
-        sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
-
-        switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
+        OUString aValue = aIter.toString();
+        switch(aIter.getToken())
         {
-            case XML_TOK_REGEQ_POS_X:
+            case XML_ELEMENT(SVG, XML_X):
+            case XML_ELEMENT(SVG_COMPAT, XML_X):
                 rImport.GetMM100UnitConverter().convertMeasureToCore(
                         aPosition.X, aValue );
                 bHasXPos = true;
                 break;
-            case XML_TOK_REGEQ_POS_Y:
+            case XML_ELEMENT(SVG, XML_Y):
+            case XML_ELEMENT(SVG_COMPAT, XML_Y):
                 rImport.GetMM100UnitConverter().convertMeasureToCore(
                         aPosition.Y, aValue );
                 bHasYPos = true;
                 break;
-            case XML_TOK_REGEQ_DISPLAY_EQUATION:
+            case XML_ELEMENT(CHART, XML_DISPLAY_EQUATION):
                 (void)::sax::Converter::convertBool(bShowEquation, aValue);
                 break;
-            case XML_TOK_REGEQ_DISPLAY_R_SQUARE:
+            case XML_ELEMENT(CHART, XML_DISPLAY_R_SQUARE):
                 (void)::sax::Converter::convertBool(bShowRSquare, aValue);
                 break;
-            case XML_TOK_REGEQ_STYLE_NAME:
+            case XML_ELEMENT(CHART, XML_STYLE_NAME):
                 sAutoStyleName = aValue;
                 break;
+            default:
+                XMLOFF_WARN_UNKNOWN("xmloff", aIter);
         }
     }
 
diff --git a/xmloff/source/chart/SchXMLRegressionCurveObjectContext.hxx b/xmloff/source/chart/SchXMLRegressionCurveObjectContext.hxx
index 4c3effb3cdf7..f9e815eb9cb8 100644
--- a/xmloff/source/chart/SchXMLRegressionCurveObjectContext.hxx
+++ b/xmloff/source/chart/SchXMLRegressionCurveObjectContext.hxx
@@ -37,10 +37,12 @@ public:
 
     virtual ~SchXMLRegressionCurveObjectContext() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
     virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
         sal_Int32 nElement,
         const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
 private:
 
@@ -61,7 +63,8 @@ public:
 
     virtual ~SchXMLEquationContext() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement (sal_Int32 Element,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& Attribs) override;
 
 private:
     SchXMLImportHelper&                           mrImportHelper;
diff --git a/xmloff/source/chart/SchXMLSeries2Context.cxx b/xmloff/source/chart/SchXMLSeries2Context.cxx
index 36aae6c8fdab..572bbba89c42 100644
--- a/xmloff/source/chart/SchXMLSeries2Context.cxx
+++ b/xmloff/source/chart/SchXMLSeries2Context.cxx
@@ -304,11 +304,10 @@ SchXMLSeries2Context::~SchXMLSeries2Context()
     SAL_WARN_IF( !maPostponedSequences.empty(), "xmloff.chart", "maPostponedSequences is NULL");
 }
 
-void SchXMLSeries2Context::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+void SchXMLSeries2Context::startFastElement (sal_Int32 /*Element*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // parse attributes
-    sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
-    const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetSeriesAttrTokenMap();
     mnAttachedAxis = 1;
 
     bool bHasRange = false;
@@ -316,26 +315,22 @@ void SchXMLSeries2Context::StartElement( const uno::Reference< xml::sax::XAttrib
     OUString aSeriesLabelString;
     bool bHideLegend = false;
 
-    for( sal_Int16 i = 0; i < nAttrCount; i++ )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
-        OUString sAttrName = xAttrList->getNameByIndex( i );
-        OUString aLocalName;
-        OUString aValue = xAttrList->getValueByIndex( i );
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
-
-        switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
+        OUString aValue = aIter.toString();
+        switch(aIter.getToken())
         {
-            case XML_TOK_SERIES_CELL_RANGE:
+            case XML_ELEMENT(CHART, XML_VALUES_CELL_RANGE_ADDRESS):
                 m_aSeriesRange = aValue;
                 bHasRange = true;
                 break;
-            case XML_TOK_SERIES_LABEL_ADDRESS:
+            case XML_ELEMENT(CHART, XML_LABEL_CELL_ADDRESS):
                 aSeriesLabelRange = aValue;
                 break;
-            case XML_TOK_SERIES_LABEL_STRING:
+            case XML_ELEMENT(LO_EXT, XML_LABEL_STRING):
                 aSeriesLabelString = aValue;
                 break;
-            case XML_TOK_SERIES_ATTACHED_AXIS:
+            case XML_ELEMENT(CHART, XML_ATTACHED_AXIS):
                 {
                     sal_Int32 nNumOfAxes = mrAxes.size();
                     for( sal_Int32 nCurrent = 0; nCurrent < nNumOfAxes; nCurrent++ )
@@ -348,10 +343,10 @@ void SchXMLSeries2Context::StartElement( const uno::Reference< xml::sax::XAttrib
                     }
                 }
                 break;
-            case XML_TOK_SERIES_STYLE_NAME:
+            case XML_ELEMENT(CHART, XML_STYLE_NAME):
                 msAutoStyleName = aValue;
                 break;
-            case XML_TOK_SERIES_CHART_CLASS:
+            case XML_ELEMENT(CHART, XML_CLASS):
                 {
                     OUString aClassName;
                     sal_uInt16 nClassPrefix =
@@ -364,9 +359,11 @@ void SchXMLSeries2Context::StartElement( const uno::Reference< xml::sax::XAttrib
                         maSeriesChartTypeName = aClassName;
                 }
                 break;
-            case XML_TOK_SERIES_HIDE_LEGEND:
+            case XML_ELEMENT(LO_EXT, XML_HIDE_LEGEND):
                 bHideLegend = aValue.toBoolean();
                 break;
+            default:
+                XMLOFF_WARN_UNKNOWN("xmloff", aIter);
         }
     }
 
@@ -733,7 +730,7 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > SchXMLSeries2Context::
             break;
 
         case XML_ELEMENT(LO_EXT, XML_PROPERTY_MAPPING):
-            pContext = new SchXMLPropertyMappingContext( mrImportHelper,
+            pContext = new SchXMLPropertyMappingContext(
                     GetImport(),
                     mrLSequencesPerIndex, m_xSeries );
             break;
diff --git a/xmloff/source/chart/SchXMLSeries2Context.hxx b/xmloff/source/chart/SchXMLSeries2Context.hxx
index 1bced37cfdeb..6b863bd39a53 100644
--- a/xmloff/source/chart/SchXMLSeries2Context.hxx
+++ b/xmloff/source/chart/SchXMLSeries2Context.hxx
@@ -85,10 +85,12 @@ public:
                           const css::awt::Size & rChartSize );
     virtual ~SchXMLSeries2Context() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
     virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
         sal_Int32 nElement,
         const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     static void initSeriesPropertySets( SeriesDefaultsAndStyles& rSeriesDefaultsAndStyles
diff --git a/xmloff/source/chart/SchXMLTableContext.cxx b/xmloff/source/chart/SchXMLTableContext.cxx
index 1c2b912a7717..e00245a2e2c3 100644
--- a/xmloff/source/chart/SchXMLTableContext.cxx
+++ b/xmloff/source/chart/SchXMLTableContext.cxx
@@ -195,11 +195,9 @@ bool lcl_tableOfRangeMatches(
 } // anonymous namespace
 
 // class SchXMLTableContext
-SchXMLTableContext::SchXMLTableContext( SchXMLImportHelper& rImpHelper,
-                                        SvXMLImport& rImport,
+SchXMLTableContext::SchXMLTableContext( SvXMLImport& rImport,
                                         SchXMLTable& aTable ) :
         SvXMLImportContext( rImport ),
-        mrImportHelper( rImpHelper ),
         mrTable( aTable ),
         mbHasRowPermutation( false ),
         mbHasColumnPermutation( false )
@@ -237,11 +235,11 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > SchXMLTableContext::cr
             mrTable.bHasHeaderRow = true;
             [[fallthrough]];
         case XML_ELEMENT(TABLE, XML_TABLE_ROWS):
-            pContext = new SchXMLTableRowsContext( mrImportHelper, GetImport(), mrTable );
+            pContext = new SchXMLTableRowsContext( GetImport(), mrTable );
             break;
 
         case XML_ELEMENT(TABLE, XML_TABLE_ROW):
-            pContext = new SchXMLTableRowContext( mrImportHelper, GetImport(), mrTable );
+            pContext = new SchXMLTableRowContext( GetImport(), mrTable );
             break;
         default:
             XMLOFF_WARN_UNKNOWN_ELEMENT("xmloff", nElement);
@@ -250,29 +248,26 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > SchXMLTableContext::cr
     return pContext;
 }
 
-void SchXMLTableContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+void SchXMLTableContext::startFastElement (sal_Int32 /*nElement*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // get table-name
-    sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
 
-    for( sal_Int16 i = 0; i < nAttrCount; i++ )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
-        OUString sAttrName = xAttrList->getNameByIndex( i );
-        OUString aLocalName;
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
-        if ( nPrefix == XML_NAMESPACE_TABLE )
+        switch(aIter.getToken())
         {
-            if ( IsXMLToken( aLocalName, XML_NAME ) )
-            {
-                mrTable.aTableNameOfFile = xAttrList->getValueByIndex( i );
-            }
-            else if ( IsXMLToken( aLocalName, XML_PROTECTED ) )
-            {
-                if ( IsXMLToken( xAttrList->getValueByIndex( i ), XML_TRUE ) )
+            case XML_ELEMENT(TABLE, XML_NAME):
+                mrTable.aTableNameOfFile = aIter.toString();
+                break;
+            case XML_ELEMENT(TABLE, XML_PROTECTED):
+                if ( IsXMLToken( aIter.toString(), XML_TRUE ) )
                 {
                     mrTable.bProtected = true;
                 }
-            }
+                break;
+            default:
+                XMLOFF_WARN_UNKNOWN("xmloff", aIter);
         }
     }
 }
@@ -419,31 +414,32 @@ SchXMLTableColumnContext::SchXMLTableColumnContext(
 {
 }
 
-void SchXMLTableColumnContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+void SchXMLTableColumnContext::startFastElement (sal_Int32 /*nElement*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // get number-columns-repeated attribute
-    sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
     sal_Int32 nRepeated = 1;
     bool bHidden = false;
 
-    for( sal_Int16 i = 0; i < nAttrCount; i++ )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
-        OUString sAttrName = xAttrList->getNameByIndex( i );
-        OUString aLocalName;
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
-
-        if( nPrefix == XML_NAMESPACE_TABLE &&
-            IsXMLToken( aLocalName, XML_NUMBER_COLUMNS_REPEATED ) )
-        {
-            OUString aValue = xAttrList->getValueByIndex( i );
-            if( !aValue.isEmpty())
-                nRepeated = aValue.toInt32();
-        }
-        else if( nPrefix == XML_NAMESPACE_TABLE &&
-            IsXMLToken( aLocalName, XML_VISIBILITY ) )
+        switch(aIter.getToken())
         {
-            OUString aVisibility = xAttrList->getValueByIndex( i );
-            bHidden = aVisibility == GetXMLToken( XML_COLLAPSE );
+            case XML_ELEMENT(TABLE, XML_NUMBER_COLUMNS_REPEATED):
+            {
+                OUString aValue = aIter.toString();
+                if( !aValue.isEmpty())
+                    nRepeated = aValue.toInt32();
+                break;
+            }
+            case XML_ELEMENT(TABLE, XML_VISIBILITY):
+            {
+                OUString aVisibility = aIter.toString();
+                bHidden = aVisibility == GetXMLToken( XML_COLLAPSE );
+                break;
+            }
+            default:
+                XMLOFF_WARN_UNKNOWN("xmloff", aIter);
         }
     }
 
@@ -471,11 +467,9 @@ SchXMLTableColumnContext::~SchXMLTableColumnContext()
 // classes for rows
 // class SchXMLTableRowsContext
 SchXMLTableRowsContext::SchXMLTableRowsContext(
-    SchXMLImportHelper& rImpHelper,
     SvXMLImport& rImport,
     SchXMLTable& aTable ) :
         SvXMLImportContext( rImport ),
-        mrImportHelper( rImpHelper ),
         mrTable( aTable )
 {
 }
@@ -491,7 +485,7 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > SchXMLTableRowsContext
     SvXMLImportContext* pContext = nullptr;
 
     if( nElement == XML_ELEMENT(TABLE, XML_TABLE_ROW) )
-        pContext = new SchXMLTableRowContext( mrImportHelper, GetImport(), mrTable );
+        pContext = new SchXMLTableRowContext( GetImport(), mrTable );
     else
         XMLOFF_WARN_UNKNOWN_ELEMENT("xmloff", nElement);
 
@@ -500,11 +494,9 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > SchXMLTableRowsContext
 
 // class SchXMLTableRowContext
 SchXMLTableRowContext::SchXMLTableRowContext(
-    SchXMLImportHelper& rImpHelper,
     SvXMLImport& rImport,
     SchXMLTable& aTable ) :
         SvXMLImportContext( rImport ),
-        mrImportHelper( rImpHelper ),
         mrTable( aTable )
 {
     mrTable.nColumnIndex = -1;
@@ -529,7 +521,7 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > SchXMLTableRowContext:
     // <table:table-cell> element
     if( nElement == XML_ELEMENT(TABLE, XML_TABLE_CELL) )
     {
-        pContext = new SchXMLTableCellContext( mrImportHelper, GetImport(), mrTable );
+        pContext = new SchXMLTableCellContext( GetImport(), mrTable );
     }
     else
     {
@@ -568,10 +560,9 @@ public:
 // classes for cells and their content
 // class SchXMLTableCellContext
 SchXMLTableCellContext::SchXMLTableCellContext(
-    SchXMLImportHelper& rImpHelper, SvXMLImport& rImport,
+    SvXMLImport& rImport,
     SchXMLTable& aTable)
     : SvXMLImportContext(rImport)
-    , mrImportHelper(rImpHelper)
     , mrTable(aTable)
     , mbReadText(false)
 {
@@ -581,33 +572,31 @@ SchXMLTableCellContext::~SchXMLTableCellContext()
 {
 }
 
-void SchXMLTableCellContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+void SchXMLTableCellContext::startFastElement (sal_Int32 /*nElement*/,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
-    sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
     OUString aValue;
-    OUString aLocalName;
     OUString aCellContent;
     SchXMLCellType eValueType  = SCH_CELL_TYPE_UNKNOWN;
-    const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetCellAttrTokenMap();
 
-    for( sal_Int16 i = 0; i < nAttrCount; i++ )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
-        OUString sAttrName = xAttrList->getNameByIndex( i );
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
-
-        switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
+        switch(aIter.getToken())
         {
-            case XML_TOK_CELL_VAL_TYPE:
-                aValue = xAttrList->getValueByIndex( i );
+            case XML_ELEMENT(OFFICE, XML_VALUE_TYPE):
+                aValue = aIter.toString();
                 if( IsXMLToken( aValue, XML_FLOAT ) )
                     eValueType = SCH_CELL_TYPE_FLOAT;
                 else if( IsXMLToken( aValue, XML_STRING ) )
                     eValueType = SCH_CELL_TYPE_STRING;
                 break;
 
-            case XML_TOK_CELL_VALUE:
-                aCellContent = xAttrList->getValueByIndex( i );
+            case XML_ELEMENT(OFFICE, XML_VALUE):
+                aCellContent = aIter.toString();
                 break;
+
+            default:
+                XMLOFF_WARN_UNKNOWN("xmloff", aIter);
         }
     }
 
diff --git a/xmloff/source/chart/SchXMLTableContext.hxx b/xmloff/source/chart/SchXMLTableContext.hxx
index 179a071f3046..ed231db352ca 100644
--- a/xmloff/source/chart/SchXMLTableContext.hxx
+++ b/xmloff/source/chart/SchXMLTableContext.hxx
@@ -39,7 +39,6 @@ namespace com::sun::star {
 class SchXMLTableContext : public SvXMLImportContext
 {
 private:
-    SchXMLImportHelper& mrImportHelper;
     SchXMLTable& mrTable;
 
     bool mbHasRowPermutation;
@@ -48,15 +47,16 @@ private:
     css::uno::Sequence< sal_Int32 > maColumnPermutation;
 
 public:
-    SchXMLTableContext( SchXMLImportHelper& rImpHelper,
-                        SvXMLImport& rImport,
+    SchXMLTableContext( SvXMLImport& rImport,
                         SchXMLTable& aTable );
     virtual ~SchXMLTableContext() override;
 
     virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
         sal_Int32 nElement,
         const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     void setRowPermutation( const css::uno::Sequence< sal_Int32 > & rPermutation );
@@ -109,7 +109,9 @@ public:
     SchXMLTableColumnContext( SvXMLImport& rImport,
                               SchXMLTable& aTable );
     virtual ~SchXMLTableColumnContext() override;
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 };
 
 // classes for rows
@@ -117,12 +119,10 @@ public:
 class SchXMLTableRowsContext : public SvXMLImportContext
 {
 private:
-    SchXMLImportHelper& mrImportHelper;
     SchXMLTable& mrTable;
 
 public:
-    SchXMLTableRowsContext( SchXMLImportHelper& rImpHelper,
-                            SvXMLImport& rImport,
+    SchXMLTableRowsContext( SvXMLImport& rImport,
                             SchXMLTable& aTable );
     virtual ~SchXMLTableRowsContext() override;
 
@@ -134,12 +134,10 @@ public:
 class SchXMLTableRowContext : public SvXMLImportContext
 {
 private:
-    SchXMLImportHelper& mrImportHelper;
     SchXMLTable& mrTable;
 
 public:
-    SchXMLTableRowContext( SchXMLImportHelper& rImpHelper,
-                           SvXMLImport& rImport,
+    SchXMLTableRowContext( SvXMLImport& rImport,
                            SchXMLTable& aTable );
     virtual ~SchXMLTableRowContext() override;
 
@@ -153,22 +151,22 @@ public:
 class SchXMLTableCellContext : public SvXMLImportContext
 {
 private:
-    SchXMLImportHelper& mrImportHelper;
     SchXMLTable& mrTable;
     OUString maCellContent;
     OUString maRangeId;
     bool mbReadText;
 
 public:
-    SchXMLTableCellContext( SchXMLImportHelper& rImpHelper,
-                            SvXMLImport& rImport,
+    SchXMLTableCellContext( SvXMLImport& rImport,
                             SchXMLTable& aTable );
     virtual ~SchXMLTableCellContext() override;
 
     virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
         sal_Int32 nElement,
         const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 };
 
diff --git a/xmloff/source/draw/ximp3dobject.cxx b/xmloff/source/draw/ximp3dobject.cxx
index 00d0ca472050..b58e7c559578 100644
--- a/xmloff/source/draw/ximp3dobject.cxx
+++ b/xmloff/source/draw/ximp3dobject.cxx
@@ -70,7 +70,9 @@ SdXML3DObjectContext::~SdXML3DObjectContext()
 {
 }
 
-void SdXML3DObjectContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXML3DObjectContext::startFastElement(
+    sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
 {
     uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
     if(xPropSet.is())
@@ -82,7 +84,7 @@ void SdXML3DObjectContext::StartElement(const uno::Reference< xml::sax::XAttribu
         }
 
         // call parent
-        SdXMLShapeContext::StartElement(xAttrList);
+        SdXMLShapeContext::startFastElement(nElement, xAttrList);
     }
 }
 
@@ -131,7 +133,9 @@ SdXML3DCubeObjectShapeContext::~SdXML3DCubeObjectShapeContext()
 {
 }
 
-void SdXML3DCubeObjectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXML3DCubeObjectShapeContext::startFastElement(
+    sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
 {
     // create shape
     AddShape( "com.sun.star.drawing.Shape3DCubeObject" );
@@ -140,7 +144,7 @@ void SdXML3DCubeObjectShapeContext::StartElement(const uno::Reference< xml::sax:
 
     // add, set style and properties from base shape
     SetStyle();
-    SdXML3DObjectContext::StartElement(xAttrList);
+    SdXML3DObjectContext::startFastElement(nElement, xAttrList);
 
     // set local parameters on shape
     uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
@@ -211,7 +215,9 @@ SdXML3DSphereObjectShapeContext::~SdXML3DSphereObjectShapeContext()
 {
 }
 
-void SdXML3DSphereObjectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXML3DSphereObjectShapeContext::startFastElement(
+    sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
 {
     // create shape
     AddShape( "com.sun.star.drawing.Shape3DSphereObject" );
@@ -220,7 +226,7 @@ void SdXML3DSphereObjectShapeContext::StartElement(const uno::Reference< xml::sa
 
     // add, set style and properties from base shape
     SetStyle();
-    SdXML3DObjectContext::StartElement(xAttrList);
+    SdXML3DObjectContext::startFastElement(nElement, xAttrList);
 
     // set local parameters on shape
     uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
@@ -278,7 +284,9 @@ SdXML3DPolygonBasedShapeContext::~SdXML3DPolygonBasedShapeContext()
 {
 }
 
-void SdXML3DPolygonBasedShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXML3DPolygonBasedShapeContext::startFastElement(
+    sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
 {
     uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
 
@@ -314,7 +322,7 @@ void SdXML3DPolygonBasedShapeContext::StartElement(const uno::Reference< xml::sa
     }
 
     // call parent
-    SdXML3DObjectContext::StartElement(xAttrList);
+    SdXML3DObjectContext::startFastElement(nElement, xAttrList);
 }
 
 
@@ -330,7 +338,9 @@ SdXML3DLatheObjectShapeContext::~SdXML3DLatheObjectShapeContext()
 {
 }
 
-void SdXML3DLatheObjectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXML3DLatheObjectShapeContext::startFastElement(
+    sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
 {
     // create shape
     AddShape( "com.sun.star.drawing.Shape3DLatheObject" );
@@ -338,7 +348,7 @@ void SdXML3DLatheObjectShapeContext::StartElement(const uno::Reference< xml::sax
     {
         // add, set style and properties from base shape
         SetStyle();
-        SdXML3DPolygonBasedShapeContext::StartElement(xAttrList);
+        SdXML3DPolygonBasedShapeContext::startFastElement(nElement, xAttrList);
     }
 }
 
@@ -354,14 +364,16 @@ SdXML3DExtrudeObjectShapeContext::~SdXML3DExtrudeObjectShapeContext()
 {
 }
 
-void SdXML3DExtrudeObjectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXML3DExtrudeObjectShapeContext::startFastElement(
+    sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
 {
     AddShape( "com.sun.star.drawing.Shape3DExtrudeObject" );
     if(mxShape.is())
     {
         // add, set style and properties from base shape
         SetStyle();
-        SdXML3DPolygonBasedShapeContext::StartElement(xAttrList);
+        SdXML3DPolygonBasedShapeContext::startFastElement(nElement, xAttrList);
     }
 }
 
diff --git a/xmloff/source/draw/ximp3dobject.hxx b/xmloff/source/draw/ximp3dobject.hxx
index 5beca9c2ff97..ac40bd88b6ac 100644
--- a/xmloff/source/draw/ximp3dobject.hxx
+++ b/xmloff/source/draw/ximp3dobject.hxx
@@ -40,7 +40,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes);
     virtual ~SdXML3DObjectContext() override;
 
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 };
 
 // dr3d:3dcube context
@@ -57,7 +59,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes);
     virtual ~SdXML3DCubeObjectShapeContext() override;
 
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 };
 
 // dr3d:3dsphere context
@@ -74,7 +78,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes);
     virtual ~SdXML3DSphereObjectShapeContext() override;
 
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 };
 
 // polygonbased context
@@ -91,7 +97,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes);
     virtual ~SdXML3DPolygonBasedShapeContext() override;
 
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 };
 
 // dr3d:3dlathe context
@@ -105,7 +113,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes);
     virtual ~SdXML3DLatheObjectShapeContext() override;
 
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 };
 
 // dr3d:3dextrude context
@@ -119,7 +129,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes);
     virtual ~SdXML3DExtrudeObjectShapeContext() override;
 
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 };
 
 #endif // INCLUDED_XMLOFF_SOURCE_DRAW_XIMP3DOBJECT_HXX
diff --git a/xmloff/source/draw/ximp3dscene.cxx b/xmloff/source/draw/ximp3dscene.cxx
index 247dca10bfb2..b062898256ff 100644
--- a/xmloff/source/draw/ximp3dscene.cxx
+++ b/xmloff/source/draw/ximp3dscene.cxx
@@ -105,7 +105,9 @@ SdXML3DSceneShapeContext::~SdXML3DSceneShapeContext()
 {
 }
 
-void SdXML3DSceneShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXML3DSceneShapeContext::startFastElement(
+    sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
 {
     // create new 3DScene shape and add it to rShapes, use it
     // as base for the new 3DScene import
@@ -125,21 +127,14 @@ void SdXML3DSceneShapeContext::StartElement(const uno::Reference< xml::sax::XAtt
     }
 
     // read attributes for the 3DScene
-    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
-    for(sal_Int16 i=0; i < nAttrCount; i++)
-    {
-        OUString sAttrName = xAttrList->getNameByIndex( i );
-        OUString aLocalName;
-        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
-        OUString sValue = xAttrList->getValueByIndex( i );
-        processSceneAttribute( nPrefix, aLocalName, sValue );
-    }
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
+        processSceneAttribute( aIter.getToken(), aIter.toString() );
 
     // #91047# call parent function is missing here, added it
     if(mxShape.is())
     {
         // call parent
-        SdXMLShapeContext::StartElement(xAttrList);
+        SdXMLShapeContext::startFastElement(nElement, xAttrList);
     }
 }
 
@@ -243,100 +238,105 @@ SvXMLImportContext * SdXML3DSceneAttributesHelper::create3DLightContext( const c
 }
 
 /** this should be called for each scene attribute */
-void SdXML3DSceneAttributesHelper::processSceneAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue )
+void SdXML3DSceneAttributesHelper::processSceneAttribute( sal_Int32 nAttributeToken, const OUString& rValue )
 {
-    if( XML_NAMESPACE_DR3D != nPrefix )
+    if( !IsTokenInNamespace(nAttributeToken, XML_NAMESPACE_DR3D) )
         return;
 
-    if( IsXMLToken( rLocalName, XML_TRANSFORM ) )
-    {
-        SdXMLImExTransform3D aTransform(rValue, mrImport.GetMM100UnitConverter());
-        if(aTransform.NeedsAction())
-            mbSetTransform = aTransform.GetFullHomogenTransform(mxHomMat);
-        return;
-    }
-    else if( IsXMLToken( rLocalName, XML_VRP ) )
+    switch(nAttributeToken & TOKEN_MASK)
     {
-        ::basegfx::B3DVector aNewVec;
-        SvXMLUnitConverter::convertB3DVector(aNewVec, rValue);
-
-        if(aNewVec != maVRP)
+        case XML_TRANSFORM:
         {
-            maVRP = aNewVec;
-            mbVRPUsed = true;
+            SdXMLImExTransform3D aTransform(rValue, mrImport.GetMM100UnitConverter());
+            if(aTransform.NeedsAction())
+                mbSetTransform = aTransform.GetFullHomogenTransform(mxHomMat);
+            return;
         }
-        return;
-    }
-    else if( IsXMLToken( rLocalName, XML_VPN ) )
-    {
-        ::basegfx::B3DVector aNewVec;
-        SvXMLUnitConverter::convertB3DVector(aNewVec, rValue);
+        case XML_VRP:
+        {
+            ::basegfx::B3DVector aNewVec;
+            SvXMLUnitConverter::convertB3DVector(aNewVec, rValue);
 
-        if(aNewVec != maVPN)
+            if(aNewVec != maVRP)
+            {
+                maVRP = aNewVec;
+                mbVRPUsed = true;
+            }
+            return;
+        }
+        case XML_VPN:
         {
-            maVPN = aNewVec;
-            mbVPNUsed = true;
+            ::basegfx::B3DVector aNewVec;
+            SvXMLUnitConverter::convertB3DVector(aNewVec, rValue);
+
+            if(aNewVec != maVPN)
+            {
+                maVPN = aNewVec;
+                mbVPNUsed = true;
+            }
+            return;
         }
-        return;
-    }
-    else if( IsXMLToken( rLocalName, XML_VUP ) )
-    {
-        ::basegfx::B3DVector aNewVec;
-        SvXMLUnitConverter::convertB3DVector(aNewVec, rValue);
+        case XML_VUP:
+        {
+            ::basegfx::B3DVector aNewVec;
+            SvXMLUnitConverter::convertB3DVector(aNewVec, rValue);
 
-        if(aNewVec != maVUP)
+            if(aNewVec != maVUP)
+            {
+                maVUP = aNewVec;
+                mbVUPUsed = true;
+            }
+            return;
+        }
+        case XML_PROJECTION:
         {
-            maVUP = aNewVec;
-            mbVUPUsed = true;
+            if( IsXMLToken( rValue, XML_PARALLEL ) )
+                mxPrjMode = drawing::ProjectionMode_PARALLEL;
+            else
+                mxPrjMode = drawing::ProjectionMode_PERSPECTIVE;
+            return;
         }
-        return;
-    }
-    else if( IsXMLToken( rLocalName, XML_PROJECTION ) )
-    {
-        if( IsXMLToken( rValue, XML_PARALLEL ) )
-            mxPrjMode = drawing::ProjectionMode_PARALLEL;
-        else
-            mxPrjMode = drawing::ProjectionMode_PERSPECTIVE;
-        return;
-    }
-    else if( IsXMLToken( rLocalName, XML_DISTANCE ) )
-    {
-        mrImport.GetMM100UnitConverter().convertMeasureToCore(mnDistance,
-                rValue);
-        return;
-    }
-    else if( IsXMLToken( rLocalName, XML_FOCAL_LENGTH ) )
-    {
-        mrImport.GetMM100UnitConverter().convertMeasureToCore(mnFocalLength,
-                rValue);
-        return;
-    }
-    else if( IsXMLToken( rLocalName, XML_SHADOW_SLANT ) )
-    {
-        ::sax::Converter::convertNumber(mnShadowSlant, rValue);
-        return;
-    }
-    else if( IsXMLToken( rLocalName, XML_SHADE_MODE ) )
-    {
-        if( IsXMLToken( rValue, XML_FLAT ) )
-            mxShadeMode = drawing::ShadeMode_FLAT;
-        else if( IsXMLToken( rValue, XML_PHONG ) )
-            mxShadeMode = drawing::ShadeMode_PHONG;
-        else if( IsXMLToken( rValue, XML_GOURAUD ) )
-            mxShadeMode = drawing::ShadeMode_SMOOTH;
-        else
-            mxShadeMode = drawing::ShadeMode_DRAFT;
-        return;
-    }
-    else if( IsXMLToken( rLocalName, XML_AMBIENT_COLOR ) )
-    {
-        ::sax::Converter::convertColor(maAmbientColor, rValue);
-        return;
-    }
-    else if( IsXMLToken( rLocalName, XML_LIGHTING_MODE ) )
-    {
-        (void)::sax::Converter::convertBool(mbLightingMode, rValue);
-        return;
+        case XML_DISTANCE:
+        {
+            mrImport.GetMM100UnitConverter().convertMeasureToCore(mnDistance,
+                    rValue);
+            return;
+        }
+        case XML_FOCAL_LENGTH:
+        {
+            mrImport.GetMM100UnitConverter().convertMeasureToCore(mnFocalLength,
+                    rValue);
+            return;
+        }
+        case XML_SHADOW_SLANT:
+        {
+            ::sax::Converter::convertNumber(mnShadowSlant, rValue);
+            return;
+        }
+        case XML_SHADE_MODE:
+        {
+            if( IsXMLToken( rValue, XML_FLAT ) )
+                mxShadeMode = drawing::ShadeMode_FLAT;
+            else if( IsXMLToken( rValue, XML_PHONG ) )
+                mxShadeMode = drawing::ShadeMode_PHONG;
+            else if( IsXMLToken( rValue, XML_GOURAUD ) )
+                mxShadeMode = drawing::ShadeMode_SMOOTH;
+            else
+                mxShadeMode = drawing::ShadeMode_DRAFT;
+            return;
+        }
+        case XML_AMBIENT_COLOR:
+        {
+            ::sax::Converter::convertColor(maAmbientColor, rValue);
+            return;
+        }
+        case XML_LIGHTING_MODE:
+        {
+            (void)::sax::Converter::convertBool(mbLightingMode, rValue);
+            return;
+        }
+        default:
+            XMLOFF_WARN_UNKNOWN_ATTR("xmloff", nAttributeToken, rValue);
     }
 }
 
diff --git a/xmloff/source/draw/ximp3dscene.hxx b/xmloff/source/draw/ximp3dscene.hxx
index 2b8f15705d36..9d06f93990cf 100644
--- a/xmloff/source/draw/ximp3dscene.hxx
+++ b/xmloff/source/draw/ximp3dscene.hxx
@@ -41,11 +41,13 @@ public:
         bool bTemporaryShape);
     virtual ~SdXML3DSceneShapeContext() override;
 
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
-    virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
     virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
         sal_Int32 nElement,
         const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual SvXMLImportContextRef CreateChildContext(
         sal_uInt16 nPrefix, const OUString& rLocalName,
diff --git a/xmloff/source/draw/ximpgrp.cxx b/xmloff/source/draw/ximpgrp.cxx
index 8eda3df0697a..6627cfacb692 100644
--- a/xmloff/source/draw/ximpgrp.cxx
+++ b/xmloff/source/draw/ximpgrp.cxx
@@ -71,7 +71,8 @@ SvXMLImportContextRef SdXMLGroupShapeContext::CreateChildContext( sal_uInt16 nPr
     return xContext;
 }
 
-void SdXMLGroupShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
+void SdXMLGroupShapeContext::startFastElement (sal_Int32 /*nElement*/,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/)
 {
     // create new group shape and add it to rShapes, use it
     // as base for the new group import
diff --git a/xmloff/source/draw/ximpgrp.hxx b/xmloff/source/draw/ximpgrp.hxx
index dfa2478c8ac2..e0c6802b9f08 100644
--- a/xmloff/source/draw/ximpgrp.hxx
+++ b/xmloff/source/draw/ximpgrp.hxx
@@ -42,7 +42,9 @@ public:
     virtual SvXMLImportContextRef CreateChildContext(
         sal_uInt16 nPrefix, const OUString& rLocalName,
         const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList ) override;
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 };
 
diff --git a/xmloff/source/draw/ximpshap.cxx b/xmloff/source/draw/ximpshap.cxx
index e9ff3b51b5cd..15e627ba3953 100644
--- a/xmloff/source/draw/ximpshap.cxx
+++ b/xmloff/source/draw/ximpshap.cxx
@@ -336,7 +336,8 @@ void SdXMLShapeContext::addGluePoint( const uno::Reference< xml::sax::XAttribute
     }
 }
 
-void SdXMLShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
+void SdXMLShapeContext::startFastElement (sal_Int32 /*nElement*/,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/)
 {
     GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
 }
@@ -970,7 +971,8 @@ void SdXMLRectShapeContext::processAttribute( sal_uInt16 nPrefix, const OUString
     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
 }
 
-void SdXMLRectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXMLRectShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // create rectangle shape
     AddShape("com.sun.star.drawing.RectangleShape");
@@ -999,7 +1001,7 @@ void SdXMLRectShapeContext::StartElement(const uno::Reference< xml::sax::XAttrib
             }
         }
     }
-    SdXMLShapeContext::StartElement(xAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 }
 
 
@@ -1054,7 +1056,8 @@ void SdXMLLineShapeContext::processAttribute( sal_uInt16 nPrefix, const OUString
     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
 }
 
-void SdXMLLineShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXMLLineShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // #85920# use SetTransformation() to handle import of simple lines.
     // This is necessary to take into account all anchor positions and
@@ -1110,7 +1113,7 @@ void SdXMLLineShapeContext::StartElement(const uno::Reference< xml::sax::XAttrib
     // set pos, size, shear and rotate and get copy of matrix
     SetTransformation();
 
-    SdXMLShapeContext::StartElement(xAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 }
 
 
@@ -1198,7 +1201,8 @@ void SdXMLEllipseShapeContext::processAttribute( sal_uInt16 nPrefix, const OUStr
     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
 }
 
-void SdXMLEllipseShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXMLEllipseShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // create rectangle shape
     AddShape("com.sun.star.drawing.EllipseShape");
@@ -1232,7 +1236,7 @@ void SdXMLEllipseShapeContext::StartElement(const uno::Reference< xml::sax::XAtt
         }
     }
 
-    SdXMLShapeContext::StartElement(xAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 }
 
 
@@ -1272,7 +1276,8 @@ SdXMLPolygonShapeContext::~SdXMLPolygonShapeContext()
 {
 }
 
-void SdXMLPolygonShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXMLPolygonShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // Add, set Style and properties from base shape
     if(mbClosed)
@@ -1339,7 +1344,7 @@ void SdXMLPolygonShapeContext::StartElement(const uno::Reference< xml::sax::XAtt
     // set pos, size, shear and rotate and get copy of matrix
     SetTransformation();
 
-    SdXMLShapeContext::StartElement(xAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 }
 
 
@@ -1376,7 +1381,8 @@ void SdXMLPathShapeContext::processAttribute( sal_uInt16 nPrefix, const OUString
     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
 }
 
-void SdXMLPathShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXMLPathShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // create polygon shape
     if(maD.isEmpty())
@@ -1490,7 +1496,7 @@ void SdXMLPathShapeContext::StartElement(const uno::Reference< xml::sax::XAttrib
     // set pos, size, shear and rotate
     SetTransformation();
 
-    SdXMLShapeContext::StartElement(xAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 }
 
 
@@ -1531,7 +1537,8 @@ void SdXMLTextBoxShapeContext::processAttribute( sal_uInt16 nPrefix, const OUStr
     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
 }
 
-void SdXMLTextBoxShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
+void SdXMLTextBoxShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // create textbox shape
     bool bIsPresShape = false;
@@ -1676,7 +1683,7 @@ void SdXMLTextBoxShapeContext::StartElement(const uno::Reference< xml::sax::XAtt
         }
     }
 
-    SdXMLShapeContext::StartElement(mxAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 }
 
 
@@ -1708,7 +1715,8 @@ void SdXMLControlShapeContext::processAttribute( sal_uInt16 nPrefix, const OUStr
     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
 }
 
-void SdXMLControlShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXMLControlShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // create Control shape
     // add, set style and properties from base shape
@@ -1738,7 +1746,7 @@ void SdXMLControlShapeContext::StartElement(const uno::Reference< xml::sax::XAtt
     // set pos, size, shear and rotate
     SetTransformation();
 
-    SdXMLShapeContext::StartElement(xAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 }
 
 
@@ -1891,7 +1899,8 @@ void SdXMLConnectorShapeContext::processAttribute( sal_uInt16 nPrefix, const OUS
     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
 }
 
-void SdXMLConnectorShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXMLConnectorShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // For security reasons, do not add empty connectors. There may have been an error in EA2
     // that created empty, far set off connectors (e.g. 63 meters below top of document). This
@@ -2042,7 +2051,7 @@ void SdXMLConnectorShapeContext::StartElement(const uno::Reference< xml::sax::XA
         }
     }
 
-    SdXMLShapeContext::StartElement(xAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 }
 
 
@@ -2098,7 +2107,8 @@ void SdXMLMeasureShapeContext::processAttribute( sal_uInt16 nPrefix, const OUStr
     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
 }
 
-void SdXMLMeasureShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXMLMeasureShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // create Measure shape
     // add, set style and properties from base shape
@@ -2123,7 +2133,7 @@ void SdXMLMeasureShapeContext::StartElement(const uno::Reference< xml::sax::XAtt
         xText->setString( " " );
     }
 
-    SdXMLShapeContext::StartElement(xAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 }
 
 void SdXMLMeasureShapeContext::endFastElement(sal_Int32 nElement)
@@ -2178,7 +2188,8 @@ void SdXMLPageShapeContext::processAttribute( sal_uInt16 nPrefix, const OUString
     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
 }
 
-void SdXMLPageShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXMLPageShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // create Page shape
     // add, set style and properties from base shape
@@ -2230,7 +2241,7 @@ void SdXMLPageShapeContext::StartElement(const uno::Reference< xml::sax::XAttrib
             xPropSet->setPropertyValue(aPageNumberStr, uno::makeAny( mnPageNumber ));
     }
 
-    SdXMLShapeContext::StartElement(xAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 }
 
 
@@ -2249,7 +2260,8 @@ SdXMLCaptionShapeContext::~SdXMLCaptionShapeContext()
 {
 }
 
-void SdXMLCaptionShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXMLCaptionShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // create Caption shape
     // add, set style and properties from base shape
@@ -2301,7 +2313,7 @@ void SdXMLCaptionShapeContext::StartElement(const uno::Reference< xml::sax::XAtt
         }
     }
 
-    SdXMLShapeContext::StartElement(xAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 }
 
 // this is called from the parent group for each unparsed attribute in the attribute list
@@ -2356,7 +2368,8 @@ void SdXMLGraphicObjectShapeContext::processAttribute( sal_uInt16 nPrefix, const
     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
 }
 
-void SdXMLGraphicObjectShapeContext::StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& )
+void SdXMLGraphicObjectShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // create graphic object shape
     OUString service;
@@ -2427,7 +2440,7 @@ void SdXMLGraphicObjectShapeContext::StartElement( const css::uno::Reference< cs
     // set pos, size, shear and rotate
     SetTransformation();
 
-    SdXMLShapeContext::StartElement(mxAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 }
 
 void SdXMLGraphicObjectShapeContext::endFastElement(sal_Int32 nElement)
@@ -2490,7 +2503,8 @@ SdXMLChartShapeContext::SdXMLChartShapeContext(
 {
 }
 
-void SdXMLChartShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
+void SdXMLChartShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     const bool bIsPresentation = isPresentationShape();
 
@@ -2544,10 +2558,10 @@ void SdXMLChartShapeContext::StartElement(const uno::Reference< xml::sax::XAttri
     // set pos, size, shear and rotate
     SetTransformation();
 
-    SdXMLShapeContext::StartElement(xAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 
     if( mxChartContext.is() )
-        mxChartContext->StartElement( xAttrList );
+        mxChartContext->startFastElement( nElement, xAttrList );
 }
 
 void SdXMLChartShapeContext::endFastElement(sal_Int32 nElement)
@@ -2585,7 +2599,8 @@ SdXMLObjectShapeContext::~SdXMLObjectShapeContext()
 {
 }
 
-void SdXMLObjectShapeContext::StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& )
+void SdXMLObjectShapeContext::startFastElement (sal_Int32 /*nElement*/,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/)
 {
     // #96717# in theorie, if we don't have a URL we shouldn't even
     // export this OLE shape. But practically it's too risky right now
@@ -2798,7 +2813,8 @@ SdXMLAppletShapeContext::~SdXMLAppletShapeContext()
 {
 }
 
-void SdXMLAppletShapeContext::StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& )
+void SdXMLAppletShapeContext::startFastElement (sal_Int32 /*nElement*/,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/)
 {
     AddShape("com.sun.star.drawing.AppletShape");
 
@@ -2948,21 +2964,19 @@ SdXMLPluginShapeContext::~SdXMLPluginShapeContext()
 {
 }
 
-void SdXMLPluginShapeContext::StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList)
+void SdXMLPluginShapeContext::startFastElement (sal_Int32 /*nElement*/,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
 
     // watch for MimeType attribute to see if we have a media object
-    for( sal_Int16 n = 0, nAttrCount = ( xAttrList.is() ? xAttrList->getLength() : 0 ); n < nAttrCount; ++n )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
-        OUString    aLocalName;
-        sal_uInt16  nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( n ), &aLocalName );
-
-        if( nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( aLocalName, XML_MIME_TYPE ) )
+        if( aIter.getToken() == XML_ELEMENT(DRAW, XML_MIME_TYPE) )
         {
-            if( xAttrList->getValueByIndex( n ) == "application/vnd.sun.star.media" )
+            if( aIter.toString() == "application/vnd.sun.star.media" )
                 mbMedia = true;
             // leave this loop
-            n = nAttrCount - 1;
+            break;
         }
     }
 
@@ -3212,7 +3226,8 @@ SdXMLFloatingFrameShapeContext::~SdXMLFloatingFrameShapeContext()
 {
 }
 
-void SdXMLFloatingFrameShapeContext::StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& )
+void SdXMLFloatingFrameShapeContext::startFastElement (sal_Int32 /*nElement*/,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/)
 {
     AddShape("com.sun.star.drawing.FrameShape");
 
@@ -3530,7 +3545,8 @@ SvXMLImportContextRef SdXMLFrameShapeContext::CreateChildContext( sal_uInt16 nPr
     return xContext;
 }
 
-void SdXMLFrameShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
+void SdXMLFrameShapeContext::startFastElement (sal_Int32 /*nElement*/,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/)
 {
     // ignore
 }
@@ -3685,7 +3701,8 @@ void SdXMLCustomShapeContext::processAttribute( sal_uInt16 nPrefix, const OUStri
     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
 }
 
-void SdXMLCustomShapeContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+void SdXMLCustomShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     // create rectangle shape
     AddShape("com.sun.star.drawing.CustomShape");
@@ -3718,7 +3735,7 @@ void SdXMLCustomShapeContext::StartElement( const uno::Reference< xml::sax::XAtt
     {
         DBG_UNHANDLED_EXCEPTION( "xmloff", "setting enhanced customshape geometry" );
     }
-    SdXMLShapeContext::StartElement(xAttrList);
+    SdXMLShapeContext::startFastElement(nElement, xAttrList);
 }
 
 void SdXMLCustomShapeContext::endFastElement(sal_Int32 nElement)
@@ -3873,7 +3890,8 @@ SdXMLTableShapeContext::~SdXMLTableShapeContext()
 {
 }
 
-void SdXMLTableShapeContext::StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList )
+void SdXMLTableShapeContext::startFastElement (sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
 {
     OUString service("com.sun.star.drawing.TableShape");
 
@@ -3952,7 +3970,7 @@ void SdXMLTableShapeContext::StartElement( const css::uno::Reference< css::xml::
             mxTableImportContext = xTableImport->CreateTableContext( xColumnRowRange );
 
         if( mxTableImportContext.is() )
-            mxTableImportContext->StartElement( xAttrList );
+            mxTableImportContext->startFastElement( nElement, xAttrList );
     }
 }
 
diff --git a/xmloff/source/draw/ximpshap.hxx b/xmloff/source/draw/ximpshap.hxx
index 84a76b315d55..ca89d1ffc431 100644
--- a/xmloff/source/draw/ximpshap.hxx
+++ b/xmloff/source/draw/ximpshap.hxx
@@ -104,7 +104,9 @@ public:
         bool bTemporaryShape);
     virtual ~SdXMLShapeContext() override;
 
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName,
@@ -128,7 +130,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes,
         bool bTemporaryShape);
     virtual ~SdXMLRectShapeContext() override;
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
     // this is called from the parent group for each unparsed attribute in the attribute list
     virtual void processAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue ) override;
@@ -150,7 +154,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes,
         bool bTemporaryShape);
     virtual ~SdXMLLineShapeContext() override;
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
     // this is called from the parent group for each unparsed attribute in the attribute list
     virtual void processAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue ) override;
@@ -175,7 +181,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes,
         bool bTemporaryShape);
     virtual ~SdXMLEllipseShapeContext() override;
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
     // this is called from the parent group for each unparsed attribute in the attribute list
     virtual void processAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue ) override;
@@ -195,7 +203,9 @@ public:
         const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList,
         css::uno::Reference< css::drawing::XShapes > const & rShapes, bool bClosed, bool bTemporaryShape);
     virtual ~SdXMLPolygonShapeContext() override;
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
     // this is called from the parent group for each unparsed attribute in the attribute list
     virtual void processAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue ) override;
@@ -215,7 +225,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes,
         bool bTemporaryShape);
     virtual ~SdXMLPathShapeContext() override;
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
     // this is called from the parent group for each unparsed attribute in the attribute list
     virtual void processAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue ) override;
@@ -234,7 +246,9 @@ public:
         const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList,
         css::uno::Reference< css::drawing::XShapes > const & rShapes);
     virtual ~SdXMLTextBoxShapeContext() override;
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
     // this is called from the parent group for each unparsed attribute in the attribute list
     virtual void processAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue ) override;
@@ -254,7 +268,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes,
         bool bTemporaryShape);
     virtual ~SdXMLControlShapeContext() override;
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
     // this is called from the parent group for each unparsed attribute in the attribute list
     virtual void processAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue ) override;
@@ -289,7 +305,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes,
         bool bTemporaryShape);
     virtual ~SdXMLConnectorShapeContext() override;
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
     // this is called from the parent group for each unparsed attribute in the attribute list
     virtual void processAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue ) override;
@@ -310,7 +328,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes,
         bool bTemporaryShape);
     virtual ~SdXMLMeasureShapeContext() override;
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     // this is called from the parent group for each unparsed attribute in the attribute list
@@ -330,7 +350,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes,
         bool bTemporaryShape);
     virtual ~SdXMLPageShapeContext() override;
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
     // this is called from the parent group for each unparsed attribute in the attribute list
     virtual void processAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue ) override;
@@ -351,7 +373,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes,
         bool bTemporaryShape);
     virtual ~SdXMLCaptionShapeContext() override;
-    virtual void StartElement(const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
     // this is called from the parent group for each unparsed attribute in the attribute list
     virtual void processAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue ) override;
@@ -372,7 +396,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes);
     virtual ~SdXMLGraphicObjectShapeContext() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
     virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName,
         const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList ) override;
@@ -394,7 +420,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes,
         bool bTemporaryShape);
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
     virtual void SAL_CALL characters( const OUString& rChars ) override;
     virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName,
@@ -418,7 +446,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes);
     virtual ~SdXMLObjectShapeContext() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
@@ -450,7 +480,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes);
     virtual ~SdXMLAppletShapeContext() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName,
@@ -478,7 +510,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes);
     virtual ~SdXMLPluginShapeContext() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName,
@@ -505,7 +539,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes);
     virtual ~SdXMLFloatingFrameShapeContext() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     // this is called from the parent group for each unparsed attribute in the attribute list
@@ -538,7 +574,9 @@ public:
     virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName,
         const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList ) override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual void processAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue ) override;
@@ -559,7 +597,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes);
     virtual ~SdXMLCustomShapeContext() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName,
@@ -580,7 +620,9 @@ public:
         css::uno::Reference< css::drawing::XShapes > const & rShapes );
     virtual ~SdXMLTableShapeContext() override;
 
-    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
     virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
     virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList ) override;


More information about the Libreoffice-commits mailing list