Xerces-c1.7で日本語タグを使うには?


sh  2004-02-23 09:07:31  No: 53209

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>
</テスト>
</ルート>


YuO  2004-02-23 10:48:26  No: 53210

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
のようにする必要があります。


sh  2004-02-23 12:59:45  No: 53211

ありがとうございます。

「例題1」→「例題1」にすればXercesC1.7ではOKってことですね。
でも上記のコードではやっぱりだめみたいです・・・
XercesC1.7と2.3ではここら辺は違うんですかね?


YuO  2004-02-23 17:39:39  No: 53212

問題をちゃんと切り分けて下さい。

まずはXerces-C 1.7付属のDOMPrintを使って,
対象となるXMLがXerces-C 1.7で解析可能かを調べて下さい。

また,SAXParseExceptionは行や桁に関する情報も持っていますから,
それらの情報をcerrに吐くなどしてみてはどうでしょう。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加