2

我正在尝试编写一个检查一些 xml 解析代码的单元测试。单元测试使用 shm_open 在内存中的 xml 文档上创建文件描述符,然后将其传递给 xmlTextReaderForFd()。但是我在随后的 xmlTextReaderRead() 上收到“文档末尾的额外内容”错误。解析代码在从实际文件创建的文件描述符上工作正常(我已经与创建的 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>
  //                                   ^
}
4

2 回答 2

2

我解决了这个问题。我正在写出 NULL 终止符,这就是导致 libxml2 阻塞的原因(尽管我可以发誓我已经尝试过没有 NULL 终止符,d'oh!)固定代码应该是:

 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 回答