示例#1
0
        private void SetLiteralValues(XmlAttributeTokenInfo fld) {
            //
            // get the literal token
            //
            _Scanner.ScanToken(XmlToken.EQUALS);
            _Scanner.ScanToken(XmlToken.QUOTE);

            String nameWPrefix = fld.NameWPrefix;
            int nameLength = nameWPrefix.Length;

            fld.QuoteChar = _Scanner.QuoteChar();
            fld.NsAttribute = false;

           //
           // always expand literals and we also need to remember the value offsets
           //
           int pos = _Scanner.CurrentPos;
           int lineNum = _Scanner.LineNum;
           int linePos = _Scanner.AbsoluteLinePos;

           if (_Scanner.ScanLiteral()) {
                _Scanner.CurrentPos = pos;
                _Scanner.AbsoluteLinePos = linePos;
                _Scanner.LineNum = lineNum;
                fld.ValueContainEntity = ValueContainEntity.None;
                ExpandLiteral(fld);
            }
            else {
                fld.ValueContainEntity = ValueContainEntity.None;
                fld.SetValue(_Scanner, null, _Scanner.StartPos, _Scanner.TextLength);
            }
            // check xmlns, xml:space, xml:lang
            //
            if (nameWPrefix[0] != 'x' || nameLength < 5) {
                goto cleanup;
            }

            if (nameWPrefix[1] == 'm' && nameWPrefix[2] == 'l') {
                if (nameWPrefix[3] == 'n' && nameWPrefix[4] == 's') {
                    fld.NsAttribute = true;
                    fld.FixNSNames();
                }
                else if ((Object)nameWPrefix == (Object)_XmlSpaceAtom) {
                    //
                    // xml:space
                    //
                    String val = fld.GetValue();
                    _XmlSpace = ConvertXmlSpace(val, fld.LineNum, fld.LinePos );

                    goto cleanup;
                }
                else if ((Object)nameWPrefix == (Object)_XmlLangAtom) {
                    //
                    // xml:lang
                    //
                    _XmlLang = fld.GetValue();
                    goto cleanup;
                }
            }
            cleanup:
            return;
        }
示例#2
0
        //
        // fields collection
        //
        private void AddAttribute() {
            _Used++;
            if (_Used >= _MaxCount) {
                XmlAttributeTokenInfo[] expandFields=null;
                int oldCount = _MaxCount;
                _MaxCount = (_MaxCount + 10) * 2;
                if (_CheckNamespaces)
                    expandFields = new XmlNSAttributeTokenInfo[_MaxCount];
                else
                    expandFields = new XmlAttributeTokenInfo[_MaxCount];

                if (_Fields != null)
                    Array.Copy(_Fields, 0, expandFields, 0, oldCount);

                if (_CheckNamespaces) {
                    for (int i = oldCount; i < _MaxCount; i++) {
                        expandFields[i] = (XmlAttributeTokenInfo) new XmlNSAttributeTokenInfo(_Scanner, _NsMgr, XmlNodeType.Attribute, _Normalization, _XmlNs);
                    }
                }
                else {
                    for (int i = oldCount; i < _MaxCount; i++) {
                        expandFields[i] = new XmlAttributeTokenInfo(_Scanner, _NsMgr, XmlNodeType.Attribute, _Normalization);
                    }
                }
                _Fields = expandFields;
            }

        }
示例#3
0
        private void Init() {
            if (_Scanner == null) {
                CreateScanner();
            }
            _Scanner.Normalization = Normalization;
            _Scanner.NamespaceSupport = _CheckNamespaces;

            if (_Encoding == null) {
                _Encoding = _Scanner.Encoding;
            }

            _TextToken       = new XmlWSTokenInfo(_Scanner, _NsMgr, XmlNodeType.Text, -1, _Normalization);
            _WhitespaceToken = new XmlWSTokenInfo(_Scanner, _NsMgr, XmlNodeType.Whitespace, -1, _Normalization);
            _ERToken         = new XmlNameValueTokenInfo(_Scanner, _NsMgr, XmlNodeType.EntityReference, -1, String.Empty, false);

            if (_CheckNamespaces) {
                _TmpToken           = new XmlNSElementTokenInfo(_Scanner, _NsMgr, XmlNodeType.None, String.Empty,-1, -1, -1, 0,false);
                _ElementToken       = new XmlNSElementTokenInfo(_Scanner, _NsMgr, XmlNodeType.Element, String.Empty,-1, -1, -1, -1,false);
                _EndElementToken    = new XmlNSElementTokenInfo(_Scanner, _NsMgr, XmlNodeType.EndElement, String.Empty,-1, -1, -1, -1,false);
                _AttributeTextToken = new XmlNSAttributeTokenInfo(_Scanner, _NsMgr, XmlNodeType.Text, _Normalization, _XmlNs);
            }
            else {
                _TmpToken           = new XmlElementTokenInfo(_Scanner, _NsMgr, XmlNodeType.None, String.Empty,-1, -1, -1, 0, false);
                _ElementToken       = new XmlElementTokenInfo(_Scanner, _NsMgr, XmlNodeType.Element, String.Empty,-1, -1, -1, -1, false);
                _EndElementToken    = new XmlElementTokenInfo(_Scanner, _NsMgr, XmlNodeType.Element, String.Empty,-1, -1, -1, -1, false);
                _AttributeTextToken = new XmlAttributeTokenInfo(_Scanner, _NsMgr, XmlNodeType.Text, _Normalization);
            }
            _CurrentToken = _TmpToken;
        }
示例#4
0
        private void PushScanner(XmlScanner newScanner, object entity, String baseURI, XmlAttributeTokenInfo[] fields,
                                 int readCount, int usedCount, int lastToken, int nextFunction, bool depthIncrement,
                                 String entityName, int depth, Encoding encoding, bool standalone, bool oldExternal,
                                 bool newExternal) {
            ScannerInfo ei = (ScannerInfo)_ScannerStack.Push();
            if (ei == null) {
                ei = new ScannerInfo();
                _ScannerStack[_ScannerStack.Length-1] = ei;
            }
            ei._Scanner = _Scanner;
            ei._Entity = entity;
            ei._BaseURI = baseURI;
            ei._LastToken = lastToken;
            ei._NextFunction = nextFunction;
            ei._DepthIncrement = depthIncrement;
            ei._Fields = fields;
            ei._ReadCount = readCount;
            ei._Used = usedCount;
            ei._EntityName = entityName;
            ei._EntityDepth = depth;
            ei._Encoding = encoding;
            ei._StandAlone = standalone;
            ei._IsExternal = oldExternal;
            _MaxCount = 0;

            //
            // reset xmldecl flag
            //
            _CantHaveXmlDecl = false;

            if (depthIncrement) {
                if (readCount != -1 && fields != null && fields[readCount] != null)
                    fields[readCount].Depth++;
                else
                    _ElementDepth++;
            }
            _Scanner = newScanner;
            if (newExternal)
                _Encoding = _Scanner.Encoding;
        }
示例#5
0
        // This method parses the entire attribute value expanding all the entities
        // it finds into an internal buffer.
        private void ExpandLiteral(XmlAttributeTokenInfo currToken) {
            // use our little buffer to build up the expanded attribute value.
            _StringBuilder.Length = 0;
            int start = _Scanner.CurrentPos;
            int token = _Scanner.ScanLiteral(true, false, true, false);
            char ch;
            int offset = 0;
            int length = 0;
            char[] array = null;
            bool expanded = false;
            int depth = 0;

            while (token != XmlToken.ENDQUOTE) {
                if (!expanded && length != 0) {
                    // must have more than one text token, so it's time to buffer up.
                    expanded = true;
                    _StringBuilder.Append(array, offset, length);
                }
                switch (token) {
                    case XmlToken.TEXT:
                        if (!expanded) {
                            array = _Scanner.InternalBuffer;
                            offset = _Scanner.TextOffset;
                            length = _Scanner.TextLength;
                        }
                        else {
                            _StringBuilder.Append(_Scanner.InternalBuffer, _Scanner.TextOffset, _Scanner.TextLength);
                        }
                        break;
                    case XmlToken.ENTITYREF:
                        expanded = true;
                        ch = _Scanner.ScanNamedEntity();
                        //
                        //  ch == 0 if general entity
                        //  ch != 0 if build in entity, for example: &lt
                        //
                        if (ch == 0) {
                            _StringBuilder.Append(_Scanner.InternalBuffer, _Scanner.TextOffset-1, _Scanner.TextLength+1);
                            currToken.ValueContainEntity = ValueContainEntity.NotResolved;
                            //currToken.UndeclaredEntity = true;
                            break;
                        }
                        else {
                            _StringBuilder.Append(ch);
                            _Scanner.Advance(); // consume the ';'
                        }
                        break;
                    case XmlToken.HEXENTREF:
                        expanded = true;
                        _StringBuilder.Append(_Scanner.ScanHexEntity());
                        break;
                    case XmlToken.NUMENTREF:
                        expanded = true;
                        _StringBuilder.Append(_Scanner.ScanDecEntity());
                        break;
                    case XmlToken.EOF:
                        depth--;
                        break;
                }
                token = _Scanner.ScanLiteral(true, false, depth==0, false);
            }

            String str = _StringBuilder.ToString();
            currToken.SetValue(_Scanner, str, start, _Scanner.CurrentPos - start);
        }
示例#6
0
		private void IncrementAttributeToken ()
		{
			currentAttribute++;
			if (attributeTokens.Length == currentAttribute) {
				XmlAttributeTokenInfo [] newArray = 
					new XmlAttributeTokenInfo [attributeTokens.Length * 2];
				attributeTokens.CopyTo (newArray, 0);
				attributeTokens = newArray;
			}
			if (attributeTokens [currentAttribute] == null)
				attributeTokens [currentAttribute] = new XmlAttributeTokenInfo (this);
			currentAttributeToken = attributeTokens [currentAttribute];
			currentAttributeToken.Clear ();
		}