R11*_*11G 3 c++ whitespace tinyxml
这个C++代码中有一个错误.它将单词之间的多个空格替换为一个空格.无法弄清楚它在哪里.它不应该修剪两个单词之间的空格并将它们替换为一个空格.这是处理空白和空白的方法.
const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding )
{
if ( !p || !*p )
{
return 0;
}
if ( encoding == TIXML_ENCODING_UTF8 )
{
while ( *p )
{
const unsigned char* pU = (const unsigned char*)p;
if ( *(pU+0)==TIXML_UTF_LEAD_0
&& *(pU+1)==TIXML_UTF_LEAD_1
&& *(pU+2)==TIXML_UTF_LEAD_2 )
{
p += 3;
continue;
}
else if(*(pU+0)==TIXML_UTF_LEAD_0
&& *(pU+1)==0xbfU
&& *(pU+2)==0xbeU )
{
p += 3;
continue;
}
else if(*(pU+0)==TIXML_UTF_LEAD_0
&& *(pU+1)==0xbfU
&& *(pU+2)==0xbfU )
{
p += 3;
continue;
}
if ( IsWhiteSpace( *p ) ) // Still using old rules for white space.
p++;
else
break;
}
}
else
{
while ( *p && IsWhiteSpace( *p ) )
// while(*p)
++p;
}
return p;
}
Run Code Online (Sandbox Code Playgroud)
输入:
<?xml version="1.0" standalone="no" ?>
<ToDo>
<bold>Toy store!</bold>
</ToDo>
Run Code Online (Sandbox Code Playgroud)
预期产量:
<?xml version="1.0" standalone="no" ?>
<ToDo>
<bold>Toy store!</bold>
</ToDo>
Run Code Online (Sandbox Code Playgroud)
观察到的输出:
<?xml version="1.0" standalone="no" ?>
<ToDo>
<bold>Toy store!</bold>
</ToDo>
Run Code Online (Sandbox Code Playgroud)
切换到TinyXML-2:
TinyXML-2的优点
- 所有未来开发的焦点.
- 更少的内存分配(1/10到1/100),使用更少的内存(约40%的TinyXML-1),并且更快.
- 没有STL要求.
- 更现代的C++,包括适当的命名空间.
- 适当和有用的空白处理
微软有一篇关于空白的优秀文章:http://msdn.microsoft.com/en-us/library/ms256097.aspx
TinyXML-2以(希望)理智的方式保留了空白区域,几乎与规范兼容.(TinyXML-1使用了完全过时的模型.)
作为第一步,所有换行符/回车符/换行符都按照XML规范的要求标准化为换行符.
文本中的空格被保留.例如:
Run Code Online (Sandbox Code Playgroud)<element> Hello, World</element>保留"Hello"之前的前导空格和逗号后的双空格.保留换行符,如下例所示:
Run Code Online (Sandbox Code Playgroud)<element> Hello again, World</element>但是,不保留元素之间的空白.虽然不是严格遵守,但跟踪和报告元素间空间是不方便的,通常不值得.TinyXML-2将这些视为相同的XML:
Run Code Online (Sandbox Code Playgroud)<document> <data>1</data> <data>2</data> <data>3</data> </document> <document><data>1</data><data>2</data><data>3</data></document>