3

この C++ コードにはバグがあります。単語間の複数の空白を 1 つのスペースに置き換えます。それがどこにあるのかわかりません。2 つの単語の間の空白を削除して 1 つに置き換えるべきではありません。これは、空白と空白を処理する方法です。

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++。
  • 空白の適切で便利な処理

ホワイトスペース

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は、これらを同じXM​​Lと見なします。

<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 に答える