xerces-c1.7で日本語タグを使用したXMLファイルをパースすると
失敗してしまいます。ネット中探してみたのですが見つからなかったため
に質問させてもらいました。
parseする前に何か設定しなくてはいけないのでしょうか?
分かる方いましたらよろしくお願いします。
---- ソース(抜粋) ----
class ErrorReporter : public ErrorHandler {
bool ok_;
public:
ErrorReporter() : ok_(true) {}
~ErrorReporter() {}
virtual void warning(const SAXParseException& ex)
{ }
virtual void error(const SAXParseException& ex)
{ ok_ = false; }
virtual void fatalError(const SAXParseException& ex)
{ ok_ = false; }
virtual void resetErrors() { ok_ = true; }
bool ok() const { return ok_; }
};
void CXMLTestDlg::OnButton2()
{
FILE *fp;
char cBuf[1024];
fp = fopen("c:\\test.xml", "r");
fread(cBuf, 1024, 1, fp);
fclose(fp);
try {
XMLPlatformUtils::Initialize();
} catch ( std::exception& stder ) {
cerr << stder.what() << endl;
}
try {
XMLPlatformUtils::Initialize();
} catch ( std::exception& stder ) {
cerr << stder.what() << endl;
}
DOMParser parser;
ErrorReporter errReporter;
parser.setErrorHandler(&errReporter);
parser.setExitOnFirstFatalError(true);
parser.setValidationScheme(DOMParser::Val_Auto);
parser.setDoNamespaces(false);
parser.setDoSchema(false);
parser.setValidationSchemaFullChecking(false);
MemBufInputSource source((unsigned char *)cBuf,
strlen(cBuf),
L"application/xml");
parser.parse(source);
if ( !errReporter.ok() ) {
return;
}
}
---- XMLファイル ----
<?xml version="1.0" encoding="Shift_JIS"?>
<ルート>
<テスト>
<例題1>sample1</例題1>
<例題2>sample2</例題2>
</テスト>
</ルート>
1とか2とかが,XMLで名前として使えないためエラーが起きているようです。
XercesC 2.3.0付属のDOMPrintを通すと,
Message: Expected an attribute name
と出るからどういうことかと思ったのですが,
XML標準(http://www.w3.org/TR/2004/REC-xml-20040204/)によると,
B Character Classesに,
>Characters in the compatibility area (i.e. with character code greater than #xF900 and less than #xFFFE) are not allowed in XML names.
とあります。
"1"はU+FF11, "2"はU+FF12ですから,要素名や属性名には使えないことになります。
というわけで,FULLWIDTHとかHALFWIDTHという名前の付いた文字の利用は諦め,
例題1→例題1
例題2→例題2
のようにする必要があります。
ありがとうございます。
「例題1」→「例題1」にすればXercesC1.7ではOKってことですね。
でも上記のコードではやっぱりだめみたいです・・・
XercesC1.7と2.3ではここら辺は違うんですかね?
問題をちゃんと切り分けて下さい。
まずはXerces-C 1.7付属のDOMPrintを使って,
対象となるXMLがXerces-C 1.7で解析可能かを調べて下さい。
また,SAXParseExceptionは行や桁に関する情報も持っていますから,
それらの情報をcerrに吐くなどしてみてはどうでしょう。
ツイート | ![]() |