2

いくつかの xml 解析コードをチェックする単体テストを作成しようとしています。単体テストでは、shm_open を使用してメモリ内の xml ドキュメントにファイル記述子を作成し、それを xmlTextReaderForFd() に渡します。しかし、その後の xmlTextReaderRead() で「ドキュメントの最後に余分なコンテンツがあります」というエラーが表示されます。解析コードは、実際のファイルから作成されたファイル記述子で正常に動作します (作成された shm_open とバイトごとの比較を行いましたが、まったく同じバイト セットです)。 shm_openで?

これが私のコードです:

void unitTest() {
  int fd = shm_open("/temporary", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
  char *pText = "<?xml version=\"1.0\"?><foo></foo>";
  write(fd, pText, strlen(pText) + 1);
  lseek(fd, 0, SEEK_SET);

  xmlTextReaderPtr pReader = xmlReaderForFd(
    fd,            // file descriptor
    "/temporary",  // base uri
    NULL,          // encoding
    0);            // options

  int result = xmlTextReaderRead(pReader);
  // result is -1
  // Get this error at console:
  //   /temporary:1: parser error : Extra content at the end of the document
  //   <?xml version="1.0"?><foo></foo>
  //                                   ^
}
4

2 に答える 2

2

私は問題を理解しました。私は NULL ターミネータを書いていましたが、それが libxml2 を詰まらせる原因でした (ただし、NULL ターミネータなしで既に試したことはありますが!) 修正されたコードは次のようになります。

 write(fd, pText, strlen(pText));
于 2012-01-24T18:21:26.867 に答える
0

また、ファイルをテキストではなくバイナリとして読み取っていることを確認してください。「テキスト」は CR/LF を取り除き、ファイルのサイズを縮小し、バッファの最後に残骸を残します。

例 (VS 2010):

struct _stat32 stat;
char *buf;
FILE *f = fopen("123.XML", "rb");    // right
//f = fopen("123.XML", "rt");    // WRONG!
_fstat(fileno(f), &stat);
buf = (char *)malloc(stat.st_size);
int ret = fread(buf, stat.st_size, 1, f);
assert(ret == 1);
// etc.
于 2015-04-05T17:49:10.973 に答える