Исключение в двухстрочной программе Xerces - PullRequest
0 голосов
/ 22 июня 2010

Следующий код дает мне исключение для строки XMLFormatTarget, но если я изменяю строку с "C:/test.xml" на "test.xml", она работает нормально.

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/framework/LocalFileFormatTarget.hpp>

using namespace xercesc;

int main()
{
    XMLPlatformUtils::Initialize();

    XMLFormatTarget *formatTarget = new LocalFileFormatTarget("C:/test.xml"); 

    return 0;
}

[править] Исключение Xerces:

Сообщение об ошибке: невозможно открыть файл 'C: \ test.xml'

Исключение Windows:

Доступ запрещен

Ответы [ 3 ]

1 голос
/ 22 июня 2010

Попробуйте перекодировать имя файла:

// Convert the path into Xerces compatible XMLCh*. 
XMLCh *tempFilePath = XMLString::transcode(filePath.c_str()); 

// Specify the target for the XML output. 
XMLFormatTarget *formatTarget = new LocalFileFormatTarget(tempFilePath);

согласно этому ответу на аналогичный вопрос .

1 голос
/ 22 июня 2010

Возможно, у вас недостаточно прав для записи в C:\. В таком случае Xerces может сообщить об ошибке, вызвавшей исключение.

Исключение Access Denied, как правило, можно ожидать, если вы попытаетесь выполнить запись в системный каталог без учетных данных администратора.


Возможно, это также связано с разделителями каталогов:

XMLFormatTarget *formatTarget = new LocalFileFormatTarget("C:\\test.xml");

В Windows разделители каталогов имеют обратную косую черту "\". Некоторым библиотекам все равно (и я никогда не использовал Xerces, поэтому не могу сказать). В C и C++ обратная косая черта также является escape-символом , поэтому вы должны удвоить , если хотите, чтобы в строке было буквальное "\".

Кроме того, если вы скажете, что вы получили исключение, это поможет нам еще больше.


Не имеет прямого отношения, но из вашего кода кажется, что вы никогда не delete formatTarget. Я предполагаю, что это пример кода, но если это не так, вы должны добавить следующую строку в ваш код:

delete formatTarget;

Или используйте указатель с областью действия вместо:

boost::scoped_ptr<XMLFormatTarget> formatTarget(new LocalFileFormatTarget("C:\\test.xml"));

Чтобы избежать утечек памяти.

0 голосов
/ 22 июня 2010

Если вы используете только test.xml, вы указываете путь относительно текущего рабочего каталога (обычно с которого была запущена программа).Так что, если ваша программа не находится непосредственно на вашем диске C :, два запуска могут указывать на разные файлы.C:\test.xml может иметь ошибку, но C:\Path\to\your\program\test.xml исправляет, поэтому последняя не дает вам никаких исключений.

В любом случае, как сказал ereOn, было бы полезно, если бы мы знали, какое исключение выдается.

...