📄 objistrxml.cpp
字号:
return '<'; default: return c; } }}void CObjectIStreamXml::EndTag(void){ char c = SkipWS(); if (m_Attlist) { if (c == '=') { m_Input.SkipChar(); c = SkipWS(); if (c == '\"') { m_Input.SkipChar(); return; } } if (c == '\"') { m_Input.SkipChar(); m_TagState = eTagInsideOpening; return; } if (c == '/' && m_Input.PeekChar(1) == '>' ) { m_Input.SkipChars(2); m_TagState = eTagInsideOpening; Found_slash_gt(); return; } } if ( c != '>' ) { c = ReadUndefinedAttributes(); if ( c != '>' ) { ThrowError(fFormatError, "'>' expected"); } } m_Input.SkipChar(); Found_gt();}bool CObjectIStreamXml::EndOpeningTagSelfClosed(void){ if (TopFrame().GetNotag()) { return SelfClosedTag(); } _ASSERT(InsideOpeningTag()); char c = SkipWS(); if (m_Attlist) { return false; } if ( c == '/' && m_Input.PeekChar(1) == '>' ) { // end of self closed tag m_Input.SkipChars(2); Found_slash_gt(); return true; } if ( c != '>' ) { c = ReadUndefinedAttributes(); if ( c == '/' && m_Input.PeekChar(1) == '>' ) { // end of self closed tag m_Input.SkipChars(2); Found_slash_gt(); return true; } if ( c != '>' ) ThrowError(fFormatError, "end of tag expected"); } // end of open tag m_Input.SkipChar(); // '>' Found_gt(); return false;}char CObjectIStreamXml::BeginOpeningTag(void){ BeginData(); // find beginning '<' char c = SkipWSAndComments(); if ( c != '<' ) ThrowError(fFormatError, "'<' expected"); c = m_Input.PeekChar(1); if ( c == '/' ) ThrowError(fFormatError, "unexpected '</'"); m_Input.SkipChar(); Found_lt(); return c;}char CObjectIStreamXml::BeginClosingTag(void){ BeginData(); // find beginning '<' char c = SkipWSAndComments(); if ( c != '<' || m_Input.PeekChar(1) != '/' ) ThrowError(fFormatError, "'</' expected"); m_Input.SkipChars(2); Found_lt_slash(); return m_Input.PeekChar();}CLightString CObjectIStreamXml::ReadName(char c){ _ASSERT(InsideTag()); if ( !IsFirstNameChar(c) ) ThrowError(fFormatError, "Name begins with an invalid character: #" +NStr::UIntToString(c)); // find end of tag name size_t i = 1, iColon = 0; while ( IsNameChar(c = m_Input.PeekChar(i)) ) { if (c == ':') { iColon = i+1; } ++i; } // save beginning of tag name const char* ptr = m_Input.GetCurrentPos(); // check end of tag name m_Input.SkipChars(i); if (c == '\n' || c == '\r') { m_Input.SkipChar(); m_Input.SkipEndOfLine(c); } m_LastTag = CLightString(ptr+iColon, i-iColon); if (iColon > 1) { string ns_prefix( CLightString(ptr, iColon-1)); if (ns_prefix == "xmlns") { string value; ReadAttributeValue(value, true); if (m_LastTag == m_CurrNsPrefix) { if (FetchFrameFromTop(1).HasTypeInfo()) { TTypeInfo type = FetchFrameFromTop(1).GetTypeInfo(); type->SetNamespacePrefix(m_CurrNsPrefix); type->SetNamespaceName(value); } } m_NsPrefixToName[m_LastTag] = value; m_NsNameToPrefix[value] = m_LastTag; char ch = SkipWS(); return IsEndOfTagChar(ch) ? CLightString() : ReadName(ch); } else if (ns_prefix == "xml") { iColon = 0; } else { if (m_Attlist) { if (m_CurrNsPrefix != ns_prefix) { string value; ReadAttributeValue(value, true); char ch = SkipWS(); return IsEndOfTagChar(ch) ? CLightString() : ReadName(ch); } } else { m_CurrNsPrefix = ns_prefix; } } } else { m_CurrNsPrefix.erase(); }#if defined(NCBI_SERIAL_IO_TRACE) cout << ", Read= " << m_LastTag;#endif return CLightString(ptr+iColon, i-iColon);}CLightString CObjectIStreamXml::RejectedName(void){ _ASSERT(!m_RejectedTag.empty()); m_LastTag = m_RejectedTag; m_RejectedTag.erase(); m_TagState = eTagInsideOpening;#if defined(NCBI_SERIAL_IO_TRACE) cout << ", Redo= " << m_LastTag;#endif return m_LastTag;}void CObjectIStreamXml::SkipAttributeValue(char c){ _ASSERT(InsideOpeningTag()); m_Input.SkipChar(); m_Input.FindChar(c); m_Input.SkipChar();}void CObjectIStreamXml::SkipQDecl(void){ _ASSERT(InsideOpeningTag()); m_Input.SkipChar(); CLightString tagName; tagName = ReadName( SkipWS());// _ASSERT(tagName == "xml"); for (;;) { char ch = SkipWS(); if (ch == '?') { break; } tagName = ReadName(ch); string value; ReadAttributeValue(value); if (tagName == "encoding") { if (value == "UTF-8") { m_Encoding = eEncoding_UTF8; } else if (value == "ISO-8859-1") { m_Encoding = eEncoding_ISO8859_1; } else if (value == "Windows-1252") { m_Encoding = eEncoding_Windows_1252; } else { ThrowError(fFormatError, "unknown encoding: " + value); } break; } } for ( ;; ) { m_Input.FindChar('?'); if ( m_Input.PeekChar(1) == '>' ) { // ?> m_Input.SkipChars(2); Found_gt(); return; } else m_Input.SkipChar(); }}string CObjectIStreamXml::ReadFileHeader(void){ for ( ;; ) { switch ( BeginOpeningTag() ) { case '?': SkipQDecl(); break; case '!': { m_Input.SkipChar(); CLightString tagName = ReadName(m_Input.PeekChar()); if ( tagName == "DOCTYPE" ) { CLightString docType = ReadName(SkipWS()); string typeName = docType; // skip the rest of !DOCTYPE for ( ;; ) { char c = SkipWS(); if ( c == '>' ) { m_Input.SkipChar(); Found_gt(); return typeName; } else if ( c == '"' || c == '\'' ) { SkipAttributeValue(c); } else { ReadName(c); } } } else { // unknown tag ThrowError(fFormatError, "unknown tag in file header: "+string(tagName)); } } default: { string typeName = ReadName(m_Input.PeekChar()); UndoClassMember(); return typeName; }/* m_Input.UngetChar('<'); Back_lt(); ThrowError(fFormatError, "unknown DOCTYPE");*/ } } return NcbiEmptyString;}string CObjectIStreamXml::PeekNextTypeName(void){ if (!m_RejectedTag.empty()) { return m_RejectedTag; } string typeName = ReadName(BeginOpeningTag()); UndoClassMember(); return typeName;}void CObjectIStreamXml::x_EndTypeNamespace(void){ if (x_IsStdXml()) { if (TopFrame().HasTypeInfo()) { TTypeInfo type = TopFrame().GetTypeInfo(); if (type->HasNamespaceName()) { string nsName = type->GetNamespaceName(); string nsPrefix = m_NsNameToPrefix[nsName];// not sure about it - should we erase them or not?// m_NsNameToPrefix.erase(nsName);// m_NsPrefixToName.erase(nsPrefix); } } if (GetStackDepth() <= 2) { m_NsNameToPrefix.clear(); m_NsPrefixToName.clear(); } }}int CObjectIStreamXml::ReadEscapedChar(char endingChar, bool* encoded){ char c = m_Input.PeekChar(); if (encoded) { *encoded = false; } if ( c == '&' ) { if (encoded) { *encoded = true; } m_Input.SkipChar(); const size_t limit = 32; size_t offset = m_Input.PeekFindChar(';', limit); if ( offset >= limit ) ThrowError(fFormatError, "entity reference is too long"); const char* p = m_Input.GetCurrentPos(); // save entity string pointer m_Input.SkipChars(offset + 1); // skip it if ( offset == 0 ) ThrowError(fFormatError, "invalid entity reference"); if ( *p == '#' ) { const char* end = p + offset; ++p; // char ref if ( p == end ) ThrowError(fFormatError, "invalid char reference"); unsigned v = 0; if ( *p == 'x' ) { // hex if ( ++p == end ) ThrowError(fFormatError, "invalid char reference"); do { c = *p++; if ( c >= '0' && c <= '9' ) v = v * 16 + (c - '0'); else if ( c >= 'A' && c <='F' ) v = v * 16 + (c - 'A' + 0xA); else if ( c >= 'a' && c <='f' ) v = v * 16 + (c - 'a' + 0xA); else ThrowError(fFormatError, "invalid symbol in char reference"); } while ( p < end ); } else { // dec if ( p == end ) ThrowError(fFormatError, "invalid char reference"); do { c = *p++; if ( c >= '0' && c <= '9' ) v = v * 10 + (c - '0'); else ThrowError(fFormatError, "invalid symbol in char reference"); } while ( p < end ); } return v & 0xFF; } else { CLightString e(p, offset); if ( e == "lt" ) return '<'; if ( e == "gt" ) return '>'; if ( e == "amp" ) return '&'; if ( e == "apos" ) return '\''; if ( e == "quot" ) return '"'; ThrowError(fFormatError, "unknown entity name: " + string(e)); } } else if ( c == endingChar ) { return -1; } if ((c & 0x80) != 0) { if (m_Encoding == eEncoding_UTF8 || m_Encoding == eEncoding_Unknown) { Uint1 ch = c; Uint1 chRes = (ch & 0x1F); m_Input.SkipChar(); ch = m_Input.PeekChar(); chRes = (chRes << 6) | (ch & 0x3F); c = chRes; } } m_Input.SkipChar(); return c & 0xFF;}CLightString CObjectIStreamXml::ReadAttributeName(void){ if ( OutsideTag() ) ThrowError(fFormatError, "attribute expected"); return ReadName(SkipWS());}void CObjectIStreamXml::ReadAttributeValue(string& value, bool skipClosing){ if ( SkipWS() != '=' ) ThrowError(fFormatError, "'=' expected"); m_Input.SkipChar(); // '=' char startChar = SkipWS(); if ( startChar != '\'' && startChar != '\"' ) ThrowError(fFormatError, "attribute value must start with ' or \""); m_Input.SkipChar(); for ( ;; ) { int c = ReadEscapedChar(startChar); if ( c < 0 ) break; value += char(c); } if (!m_Attlist || skipClosing) { m_Input.SkipChar(); }}char CObjectIStreamXml::ReadUndefinedAttributes(void){ char c; m_Attlist = true; for (;;) { c = SkipWS(); if (IsEndOfTagChar(c)) { m_Attlist = false; break; } CLightString tagName = ReadName(c); if (tagName.GetLength()) { string value; ReadAttributeValue(value, true); } } return c;}bool CObjectIStreamXml::ReadBool(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -