2016-05-04 32 views
0

Visual Studio C++でEscapeXMLの特殊文字を変換したいと考えています。EscapeXML C++ Visual Studio

#include "stdafx.h" 
#include "atlenc.h"; 
#include <string> 
#include <iostream> 
using namespace std; 


int main() 
{ 
    std::string test = "& & &"; 

    inline int EscapeXML(const wchar_t * test)throw(); 

    cout << test; 
    return 0; 
} 

出力が必要です。

&amp; &amp; &amp; 

Visual StudioにはEscapeXML機能がありますが、変換はしません。 https://msdn.microsoft.com/en-us/library/y0y57exc(v=vs.71).aspx

答えて

1

コードにはいくつか問題があります。まず、#includeディレクティブをセミコロンで終わらせるべきではありません。

しかし、主な問題は、あなたのコードがEscapeXMLを呼び出していないということです。実際にはそれを再定義しています。あなたがのstd :: wstringの(:wcoutとstd)を使用する必要があるので、EscapeXMLは、ワイド文字列(wchar_t型の*)へのポインタを期待していること

#include "stdafx.h" 
#include "atlenc.h" 
#include <string> 
#include <iostream> 

int main() 
{ 
    std::wstring test = L"& & &"; 

    int output_size = EscapeXML(test.c_str(), test.length(), 0, 0, ATL_ESC_FLAG_ATTR); 

    std::wstring testout; 
    testout.resize(output_size); 
    EscapeXML(test.c_str(), test.length(), &testout[0], output_size, ATL_ESC_FLAG_ATTR); 

    std::wcout << testout; 
    return 0; 
} 

注:何が欲しいのはこのようなものです。入力文字列と "エスケープ"バージョンを書き込むことができるバッファの両方に渡す必要があります。

バッファがどれくらい大きくなる必要があるかわからないため、EscapeXMLをヌルポインタと呼びます。文字列を返すほとんどのWindows API関数はこれを行い、必要なバッファサイズを返します。次に、別のwstringをインスタンス化し、必要なサイズにサイズを変更して、EscapeXMLをもう一度呼び出します。今回は実際にポインタをバッファに渡します。実際、c_str()はconstポインタを返します(const_castを使用しない限り、非constポインタを期待する関数に渡すことはできません)。代わりに、testout [0]へのポインタを渡します。 wstringの内部文字列バッファ

関連する問題