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

时间:2012-07-12 11:03:12

标签: 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;
}

输入:

<?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>

2 个答案:

答案 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年不存在,但它现在存在。