📄 objostrxml.cpp
字号:
void CObjectOStreamXml::SetRealValueFormat( CObjectOStreamXml::ERealValueFormat fmt){ m_RealFmt = fmt;}void CObjectOStreamXml::SetEnforcedStdXml(bool set){ m_EnforcedStdXml = set; if (m_EnforcedStdXml) { m_StdXml = false; }}string CObjectOStreamXml::GetPosition(void) const{ return "line "+NStr::UIntToString(m_Output.GetLine());}static string GetPublicModuleName(TTypeInfo type){ const string& s = type->GetModuleName(); string name; for ( string::const_iterator i = s.begin(); i != s.end(); ++i ) { char c = *i; if ( !isalnum(c) ) name += ' '; else name += c; } return name;}string CObjectOStreamXml::GetModuleName(TTypeInfo type){ string name; if( !m_DTDFileName.empty() ) { name = m_DTDFileName; } else { const string& s = type->GetModuleName(); for ( string::const_iterator i = s.begin(); i != s.end(); ++i ) { char c = *i; if ( c == '-' ) name += '_'; else name += c; } } return name;}void CObjectOStreamXml::WriteFileHeader(TTypeInfo type){ m_Output.PutString("<?xml version=\"1.0"); switch (m_Encoding) { default: break; case eEncoding_UTF8: m_Output.PutString("\" encoding=\"UTF-8"); break; case eEncoding_ISO8859_1: m_Output.PutString("\" encoding=\"ISO-8859-1"); break; case eEncoding_Windows_1252: m_Output.PutString("\" encoding=\"Windows-1252"); break; } m_Output.PutString("\"?>"); m_Output.PutEol(); if (!m_UseSchemaRef && m_UseDTDRef) { m_Output.PutString("<!DOCTYPE "); m_Output.PutString(type->GetName()); if (m_UsePublicId) { m_Output.PutString(" PUBLIC \""); if (m_PublicId.empty()) { m_Output.PutString("-//NCBI//"); m_Output.PutString(GetPublicModuleName(type)); m_Output.PutString("/EN"); } else { m_Output.PutString(m_PublicId); } m_Output.PutString("\""); } else { m_Output.PutString(" SYSTEM"); } m_Output.PutString(" \""); m_Output.PutString(GetDTDFilePrefix() + GetModuleName(type)); m_Output.PutString(".dtd\">"); m_Output.PutEol(); } m_LastTagAction = eTagClose;}void CObjectOStreamXml::x_WriteClassNamespace(TTypeInfo type){ OpenTagEndBack(); if (m_UseSchemaLoc) { m_Output.PutEol(); m_Output.PutString(" "); } m_Output.PutString(" xmlns"); if (!m_CurrNsPrefix.empty()) { m_Output.PutChar(':'); m_Output.PutString(m_CurrNsPrefix); } m_Output.PutString("=\""); string ns_name( m_NsPrefixToName[m_CurrNsPrefix]); if (ns_name.empty()) { ns_name = GetDefaultSchemaNamespace(); } m_Output.PutString(ns_name + "\""); if (m_UseSchemaLoc) { m_Output.PutEol(); string xs_name("http://www.w3.org/2001/XMLSchema-instance"); string xs_prefix("xs"); if (m_NsNameToPrefix.find(xs_name) == m_NsNameToPrefix.end()) { for (char a='a'; m_NsPrefixToName.find(xs_prefix) != m_NsPrefixToName.end(); ++a) { xs_prefix += a; } m_NsPrefixToName[xs_prefix] = xs_name; m_NsNameToPrefix[xs_name] = xs_prefix; m_Output.PutString(" xmlns:"); m_Output.PutString(xs_prefix + "=\""); m_Output.PutString(xs_name + "\""); m_Output.PutEol(); m_Output.PutString(" "); m_Output.PutString(xs_prefix); m_Output.PutString(":schemaLocation=\""); m_Output.PutString(ns_name + " "); m_Output.PutString(GetDTDFilePrefix() + GetModuleName(type)); m_Output.PutString(".xsd\""); m_Output.PutEol(); } } OpenTagEnd();}bool CObjectOStreamXml::x_ProcessTypeNamespace(TTypeInfo type){ if (m_UseSchemaRef) { string nsName; if (type->HasNamespaceName()) { nsName = type->GetNamespaceName(); } else if (m_NsPrefixes.empty()) { nsName = GetDefaultSchemaNamespace(); } return x_BeginNamespace(nsName,type->GetNamespacePrefix()); } return false;}void CObjectOStreamXml::x_EndTypeNamespace(void){ if (m_UseSchemaRef) { if (TopFrame().HasTypeInfo()) { TTypeInfo type = TopFrame().GetTypeInfo(); if (type->HasNamespaceName()) { x_EndNamespace(type->GetNamespaceName()); } } }}bool CObjectOStreamXml::x_BeginNamespace(const string& ns_name, const string& ns_prefix){ if (!m_UseSchemaRef || ns_name.empty()) { return false; } string nsPrefix(ns_prefix); if (m_NsNameToPrefix.find(ns_name) == m_NsNameToPrefix.end()) { for (char a='a'; m_NsPrefixToName.find(nsPrefix) != m_NsPrefixToName.end(); ++a) { nsPrefix += a; } m_CurrNsPrefix = nsPrefix; m_NsNameToPrefix[ns_name] = nsPrefix; m_NsPrefixToName[nsPrefix] = ns_name; m_NsPrefixes.push(nsPrefix); return true; } else { m_CurrNsPrefix = m_NsNameToPrefix[ns_name]; m_NsPrefixes.push(m_CurrNsPrefix); } return false;}void CObjectOStreamXml::x_EndNamespace(const string& ns_name){ if (!m_UseSchemaRef || ns_name.empty()) { return; } string nsPrefix = m_NsNameToPrefix[ns_name];// not sure about it - should we erase them or not?// m_NsNameToPrefix.erase(ns_name);// m_NsPrefixToName.erase(nsPrefix); m_NsPrefixes.pop(); m_CurrNsPrefix = m_NsPrefixes.empty() ? kEmptyStr : m_NsPrefixes.top(); if (!m_Attlist && GetStackDepth() <= 2) { m_NsNameToPrefix.clear(); m_NsPrefixToName.clear(); }}void CObjectOStreamXml::WriteEnum(const CEnumeratedTypeValues& values, TEnumValueType value, const string& valueName){ if ( !values.GetName().empty() ) { // global enum OpenTagStart(); m_Output.PutString(values.GetName()); if ( !valueName.empty() ) { m_Output.PutString(" value=\""); m_Output.PutString(valueName); m_Output.PutChar('\"'); } if ( values.IsInteger() ) { OpenTagEnd(); m_Output.PutInt4(value); CloseTagStart(); m_Output.PutString(values.GetName()); CloseTagEnd(); } else { _ASSERT(!valueName.empty()); SelfCloseTagEnd(); m_LastTagAction = eTagClose; } } else { // local enum (member, variant or element) if ( valueName.empty() ) { _ASSERT(values.IsInteger()); m_Output.PutInt4(value); } else { if (m_LastTagAction == eAttlistTag) { m_Output.PutString(valueName); } else { OpenTagEndBack(); m_Output.PutString(" value=\""); m_Output.PutString(valueName); m_Output.PutChar('"'); if ( values.IsInteger() ) { OpenTagEnd(); m_Output.PutInt4(value); } else { SelfCloseTagEnd(); } } } }}void CObjectOStreamXml::WriteEnum(const CEnumeratedTypeValues& values, TEnumValueType value){ WriteEnum(values, value, values.FindName(value, values.IsInteger()));}void CObjectOStreamXml::CopyEnum(const CEnumeratedTypeValues& values, CObjectIStream& in){ TEnumValueType value = in.ReadEnum(values); WriteEnum(values, value, values.FindName(value, values.IsInteger()));}void CObjectOStreamXml::WriteEscapedChar(char c){// http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char switch ( c ) { case '&': m_Output.PutString("&"); break; case '<': m_Output.PutString("<"); break; case '>': m_Output.PutString(">"); break; case '\'': m_Output.PutString("'"); break; case '"': m_Output.PutString("""); break; default: if ((unsigned int)c < 0x20) { m_Output.PutString("&#x"); Uint1 ch = c; unsigned hi = ch >> 4; unsigned lo = ch & 0xF; if ( hi ) { m_Output.PutChar("0123456789abcdef"[hi]); } m_Output.PutChar("0123456789abcdef"[lo]); m_Output.PutChar(';'); } else if ((unsigned int)c >= 0x80) { if ( m_Encoding == eEncoding_UTF8 || m_Encoding == eEncoding_Unknown ) { Uint1 ch = c; m_Output.PutChar((ch >> 6) | 0xC0); m_Output.PutChar((ch & 0x3F) | 0x80); } else { m_Output.PutChar(c); } } else { m_Output.PutChar(c); } break; }}void CObjectOStreamXml::WriteBool(bool data){ OpenTagEndBack(); if ( data ) m_Output.PutString(" value=\"true\""); else m_Output.PutString(" value=\"false\""); SelfCloseTagEnd();}void CObjectOStreamXml::WriteChar(char data){ WriteEscapedChar(data);}void CObjectOStreamXml::WriteInt4(Int4 data){ m_Output.PutInt4(data);}void CObjectOStreamXml::WriteUint4(Uint4 data){ m_Output.PutUint4(data);}void CObjectOStreamXml::WriteInt8(Int8 data){ m_Output.PutInt8(data);}void CObjectOStreamXml::WriteUint8(Uint8 data){ m_Output.PutUint8(data);}void CObjectOStreamXml::WriteDouble2(double data, size_t digits){ if (isnan(data)) { ThrowError(fInvalidData, "invalid double: not a number"); } if (!finite(data)) { ThrowError(fInvalidData, "invalid double: infinite"); } char buffer[512]; SIZE_TYPE width; if (m_RealFmt == eRealFixedFormat) { int shift = int(ceil(log10(fabs(data)))); int precision = int(digits - shift); if ( precision < 0 ) precision = 0; if ( precision > 64 ) // limit precision of data precision = 64; width = NStr::DoubleToString(data, (unsigned int)precision, buffer, sizeof(buffer)); if (precision != 0) { while (buffer[width-1] == '0') { --width; } if (buffer[width-1] == '.') { --width; } } } else { width = sprintf(buffer, "%.*g", digits, data); } m_Output.PutString(buffer, width);}void CObjectOStreamXml::WriteDouble(double data){ WriteDouble2(data, DBL_DIG);}void CObjectOStreamXml::WriteFloat(float data){ WriteDouble2(data, FLT_DIG);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -