2012-01-24 4 views
2

xml解析コードをチェックする単体テストを作成しようとしています。ユニットテストは、shm_openを使用してメモリ内のxmlドキュメントにファイル記述子を作成し、それをxmlTextReaderForFd()に渡します。しかし、後続のxmlTextReaderRead()で "ドキュメントの最後に余分なコンテンツ"エラーが表示されます。解析コードは、実際のファイルから作成されたファイル記述子で正常に動作します(shm_openを使ってバイトごとに比較しました。これはまったく同じバイトセットです)。なぜファイル記述子でlibxml2が窒息するのですか? shm_openで?libxml2を使用して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> 
    //         ^
} 

答えて

2

が、私はこの問題を考え出し:

は、ここに私のコードです。私は、NULLターミネータを書いていた、それはlibxml2のは、固定コードは単純でなければなりません(私が宣誓している可能性が、私はすでにああドール、NULL終端することなく、それを試してみました!)チョークさせたものです。また

write(fd, pText, strlen(pText)); 
0

、テキストではなくバイナリとしてファイルを読み込んでいることを確認してください。 'Text'は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.