不应该从XML中删除多个空格

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)

seh*_*ehe 5

切换到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规范的要求标准化为换行符.

文本中的空格被保留.例如:

<element> Hello,  World</element>
Run Code Online (Sandbox Code Playgroud)

保留"Hello"之前的前导空格和逗号后的双空格.保留换行符,如下例所示:

<element> Hello again,  
          World</element>
Run Code Online (Sandbox Code Playgroud)

但是,不保留元素之间的空白.虽然不是严格遵守,但跟踪和报告元素间空间是不方便的,通常不值得.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>
Run Code Online (Sandbox Code Playgroud)