3

此 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>
4

2 回答 2

5

切换到TinyXML-2

TinyXML-2 的优势

  • 所有未来开发的重点。
  • 更少的内存分配(1/10 到 1/100),使用更少的内存(大约是 TinyXML-1 的 40%),并且速度更快。
  • 没有 STL 要求。
  • 更现代的 C++,包括适当的命名空间。
  • 正确和有用的空白处理

白色空间

微软有一篇关于空白的优秀文章: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>
于 2012-07-12T11:19:08.110 回答
0

尝试在文件中设置bool TiXmlBase::condenseWhiteSpace,或在运行时调用。第一个对我有用。falsetinyxml.cppTiXmlBase::SetCondenseWhiteSpace(false)

这可能在 2012 年不存在,但现在存在。

于 2017-08-16T14:51:11.313 回答