l'écriture d'un document XML avec Xerces 3.0.1 et C++ sur windows
j'ai la fonction suivante que j'ai écrit pour créer un fichier XML à l'aide de Xerces 3.0.1, si j'appelle cette fonction avec un chemin d'accès de l' "foo.xml" ou "../foo.xml" il fonctionne très bien, mais si je passe en "c:/foo.xml" puis-je obtenir une exception sur cette ligne
XMLFormatTarget *formatTarget = new LocalFileFormatTarget(targetPath);
quelqu'un peut m'expliquer pourquoi mon code fonctionne pour les chemins relatifs, mais pas les chemins d'accès absolus s'il vous plaît?
merci beaucoup.
const int ABSOLUTE_PATH_FILENAME_PREFIX_SIZE = 9;
void OutputXML(xercesc::DOMDocument* pmyDOMDocument, std::string filePath)
{
//Return the first registered implementation that has the desired features. In this case, we are after a DOM implementation that has the LS feature... or Load/Save.
DOMImplementation *implementation = DOMImplementationRegistry::getDOMImplementation(L"LS");
//Create a DOMLSSerializer which is used to serialize a DOM tree into an XML document.
DOMLSSerializer *serializer = ((DOMImplementationLS*)implementation)->createLSSerializer();
//Make the output more human readable by inserting line feeds.
if (serializer->getDomConfig()->canSetParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true))
serializer->getDomConfig()->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true);
//The end-of-line sequence of characters to be used in the XML being written out.
serializer->setNewLine(XMLString::transcode("\r\n"));
//Convert the path into Xerces compatible XMLCh*.
XMLCh *tempFilePath = XMLString::transcode(filePath.c_str());
//Calculate the length of the string.
const int pathLen = XMLString::stringLen(tempFilePath);
//Allocate memory for a Xerces string sufficent to hold the path.
XMLCh *targetPath = (XMLCh*)XMLPlatformUtils::fgMemoryManager->allocate((pathLen + ABSOLUTE_PATH_FILENAME_PREFIX_SIZE) * sizeof(XMLCh));
//Fixes a platform dependent absolute path filename to standard URI form.
XMLString::fixURI(tempFilePath, targetPath);
//Specify the target for the XML output.
XMLFormatTarget *formatTarget = new LocalFileFormatTarget(targetPath);
//XMLFormatTarget *myFormTarget = new StdOutFormatTarget();
//Create a new empty output destination object.
DOMLSOutput *output = ((DOMImplementationLS*)implementation)->createLSOutput();
//Set the stream to our target.
output->setByteStream(formatTarget);
//Write the serialized output to the destination.
serializer->write(pmyDOMDocument, output);
//Cleanup.
serializer->release();
XMLString::release(&tempFilePath);
delete formatTarget;
output->release();
}
+1 car j'ai le même problème. Je ne pense pas que la réponse que vous avez choisi comme correcte résout le problème mais comme je ne les autorisations nécessaires (même emplacement de fichier pour à la fois relative et absolue des chemins, des travaux relatifs, absolus qui ne marche pas). Comment avez-vous résolu votre problème???
Je suis sûr que c'était un problème d'autorisations pour moi, si je me souviens bien, j'étais en train d'écrire à la racine du disque C sous Vista, et il ne me laisserait pas.
Merci Jon. Je pense que vous devez avoir raison. J'ai corrigé quelques autres questions dans ma xerces wrapper et maintenant il fonctionne à la fois absolue et relative. Et avec à la fois des " / " et "\ \ ' annuaire des séparateurs 🙂
Je suis sûr que c'était un problème d'autorisations pour moi, si je me souviens bien, j'étais en train d'écrire à la racine du disque C sous Vista, et il ne me laisserait pas.
Merci Jon. Je pense que vous devez avoir raison. J'ai corrigé quelques autres questions dans ma xerces wrapper et maintenant il fonctionne à la fois absolue et relative. Et avec à la fois des " / " et "\ \ ' annuaire des séparateurs 🙂
OriginalL'auteur dangerousdave | 2010-05-24
Vous devez vous connecter pour publier un commentaire.
Êtes-vous à l'aide de Windows Vista? peut-être que vous n'avez pas les autorisations nécessaires?
Voir cette question: Exception dans deux ligne de Xerces programme
OriginalL'auteur Gungho
Il ressemble à votre chemin d'accès du fichier est incorrect. Il devrait être un fichier:///C:/. Voir la suite pour plus d'informations:
http://en.wikipedia.org/wiki/File_URI_scheme
Mise à JOUR: Le code suivant fonctionne pour moi avec Visual Studio 2008. C'est rapide à faire pirater à l'aide de votre code avec quelques exemples qui vient avec Xerces.
Ici est la chaîne qui est passée à LocalFileFormatTarget: "file:///c:/foo.xml"
Quel message d'erreur avez-vous? Je suis en supposant que vous avez enroulé dans un try/catch.
impossible d'ouvrir le fichier 'file:///c:/foo.xml'
Avez-vous essayé d'utiliser GetLastError() avec FormatMessage pour obtenir windows description de l'erreur? Je l'ai essayé avec votre code et j'ai obtenu Le nom du fichier, le nom du répertoire ou de la syntaxe du nom de volume est incorrecte"
OriginalL'auteur Garett
De la recherche à la source, le nom de fichier est transmis par le biais de
WindowsFileMgr::fileOpen
dans WindowsFileMgr.cpp, qui n'apparaît pas s'attendre à un URI.Alors, avez-vous essayé de ne pas convertir le nom du fichier à un URI, par exemple, juste utiliser:
(peut-être besoin d'échapper à la barre oblique inverse)
?
Êtes-vous en les reliant à une version de débogage de xerces? Vous devriez être en mesure de faire un pas dans la fonction que j'ai mentionné ci-dessus ajouter voir l'appel à la Windows CreateFileW fonction.
OriginalL'auteur jon-hanson
Exécute le code ci-dessus peut donner l'erreur - 'DOMDocument": symbole ambigu, dans lequel cas, remplacez DOMDocument par xercesc::DOMDocument comme il est également un objet DOMDocument classe définie dans msxml.h en tête, qui conduit à l'ambiguïté.
OriginalL'auteur Vigo