0

次のコードは行に例外を与えますXMLFormatTargetが、文字列をからに変更する"C:/test.xml""test.xml"正常に機能します。

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/framework/LocalFileFormatTarget.hpp>

using namespace xercesc;

int main()
{
    XMLPlatformUtils::Initialize();

    XMLFormatTarget *formatTarget = new LocalFileFormatTarget("C:/test.xml"); 

    return 0;
}

[編集]Xercesの例外は次のとおりです。

エラーメッセージ:ファイル'C:\test.xml'を開くことができません

Windowsの例外は次のとおりです。

アクセスが拒否されました

4

3 に答える 3

1

に書き込むための十分な権限がない可能性がありますC:\。このような場合、Xercesは例外をスローするエラーを報告する可能性があります。

例外Access Deniedは通常、管理者の資格情報なしでシステムディレクトリに書き込もうとした場合に予想されることです。


多分それはディレクトリセパレータと関係があるかもしれません:

XMLFormatTarget *formatTarget = new LocalFileFormatTarget("C:\\test.xml");

Windowsでは、ディレクトリ区切り文字は円記号"\"です。一部のライブラリは気にしません(そして私はXercesを使用したことがないので、わかりません)。CとではC++、バックスラッシュもエスケープ文字であるため、文字列にリテラルの「\」が必要な場合は、バックスラッシュを2倍にする必要があります。

また、あなたが受けた例外が何であったかを私たちに伝えることは私たちをさらに助けるでしょう。


直接関係はありませんが、コードからは、決して関係がないようですdelete formatTarget。これはサンプルコードだと思いますが、そうでない場合は、コードに次の行を追加する必要があります。

delete formatTarget;

または、代わりにスコープポインターを使用します。

boost::scoped_ptr<XMLFormatTarget> formatTarget(new LocalFileFormatTarget("C:\\test.xml"));

メモリリークを回避するため。

于 2010-06-22T08:35:34.940 に答える
1

ファイル名をトランスコードしてみてください:

// Convert the path into Xerces compatible XMLCh*. 
XMLCh *tempFilePath = XMLString::transcode(filePath.c_str()); 

// Specify the target for the XML output. 
XMLFormatTarget *formatTarget = new LocalFileFormatTarget(tempFilePath);

同様の質問に対するこの回答のとおり。

于 2010-06-22T10:27:00.897 に答える
0

使用する場合はtest.xml、現在の作業ディレクトリ(通常はプログラムが開始された場所)からの相対パスを指定します。したがって、プログラムがC:ドライブに直接ない場合、2回の実行で異なるファイルを指す可能性があります。にはC:\test.xmlエラーがある可能性がありますが、C:\Path\to\your\program\test.xml正しいので、後者でも例外はありません。

とにかく、ereOnが言ったように、どの例外がスローされるかを知っていれば役に立ちます。

于 2010-06-22T08:46:50.920 に答える