此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;
}
输入:
<?xml version="1.0" standalone="no" ?>
<ToDo>
<bold>Toy store!</bold>
</ToDo>
预期输出:
<?xml version="1.0" standalone="no" ?>
<ToDo>
<bold>Toy store!</bold>
</ToDo>
观察输出:
<?xml version="1.0" standalone="no" ?>
<ToDo>
<bold>Toy store!</bold>
</ToDo>
答案 0 :(得分:5)
切换到TinyXML-2:
TinyXML-2的优点
- 所有未来开发的焦点。
- 内存分配更少(1/10到1/100),使用更少的内存(约占TinyXML-1的40%),速度更快。
- 没有STL要求。
- 更现代的C ++,包括适当的命名空间。
- 正确有用地处理空白
Microsoft有一篇关于空格的优秀文章:http://msdn.microsoft.com/en-us/library/ms256097.aspx
TinyXML-2以一种(希望)理智的方式保留空白区域,几乎与规范兼容。(TinyXML-1使用了完全过时的模型。)
作为第一步,所有换行符/回车符/换行符都按照XML规范的要求标准化为换行符。
保留文本中的空白区域。例如:
<element> Hello, World</element>
保留“Hello”之前的前导空格和逗号后的双空格。保留换行符,如下例所示:
<element> Hello again, World</element>
但是,不保留元素之间的空白。虽然不是严格遵守,但跟踪和报告元素间空间是不方便的,通常不值得。 TinyXML-2将这些视为相同的XML:
<document> <data>1</data> <data>2</data> <data>3</data> </document> <document><data>1</data><data>2</data><data>3</data></document>
答案 1 :(得分:0)
尝试在文件bool TiXmlBase::condenseWhiteSpace
中将false
设置为tinyxml.cpp
,或在运行时调用TiXmlBase::SetCondenseWhiteSpace(false)
。第一个为我工作。
这可能在2012年不存在,但它现在存在。