2016-03-20 7 views
0

C++でxercesを使用してSOAP WSDLを作成しようとしています。 XMLを作成して1つのファイルに入れたいだけです。Xerces-Cがルート名にコロンを入れるのに失敗しました

私は、XML文書

pDomDocument = p_DOMImplementation->createDocument("http://schemas.xmlsoap.org/soap/envelope/", 
           convertStringToXmlCh("soapenv:Envelope"), 
           0); 

を作成するためのコードスニペットの下に使用しています。しかし.Exceptionを実行している間にこの行は例外をスローして、XML作成中:「メッセージでキャッチDOM例外:無効または不正なXML文字を」。

また、my xmlには、デフォルトの名前空間から3つの名前空間があります。 xercesを使ってこれをどのように追加できますか?

ただし、createDocument関数のルート名からコロン(:)を削除すると、フローが実行されます。 xercesを介してXML文書に名前空間の名前を付ける方法を教えてください。

Googleで多くの検索を成功させました。

編集1:

DOMImplementation* p_DOMImplementation = NULL; 
     p_DOMImplementation = DOMImplementationRegistry::getDOMImplementation(XMLString::transcode("core")); 
     DOMDocument* pDomDocument=NULL; 

     try 
     { 
      pDomDocument = p_DOMImplementation->createDocument(convertStringToXmlCh(uri), //Root element namespace URI 
                 convertStringToXmlCh(rootNode), // Root element name 
                 0); //Document type (DTD) 
     } 
     catch(DOMException& e) 
     { 

      BL_LOG_MSG(BL_FATAL,"Caught dom exception with message :<1>",XMLString::transcode(e.getMessage())) 
      return NULL; 
     } 

編集2:

int main() 
{ 

     DOMImplementation* p_DOMImplementation = NULL; 
     XMLPlatformUtils::Initialize(); 
     p_DOMImplementation = DOMImplementationRegistry::getDOMImplementation(convertStringToXmlCh("Core")); 
     DOMDocument* pDomDocument=NULL; 

     try 
     { 
       pDomDocument = p_DOMImplementation->createDocument(convertStringToXmlCh("http://schemas.xmlsoap.org/soap/envelope/"), //Root element namespace URI 
                    convertStringToXmlCh("soapenv:envelope"), // Root element name 
           NULL); //Document type (DTD) 
     } 
     catch(DOMException& e) 
     { 
       cout <<"Caught xception:"<<e.getMessage(); 
       return NULL; 
     } 
     catch(...) 
     { 

       cout <<"Caught xception:"; 
       return NULL; 
     } 
     if(pDomDocument == NULL) 
     { 
         return NULL; 
         cout<<"NULL returned"; 
     } 

     DOMElement* pRootElement = pDomDocument->getDocumentElement(); 
     addAttributeToDomElementNS(pRootElement,"xmlns:typ","http://abcd.fg/V1/types"); 

     char* path = "https://stackoverflow.com/users/gen/app/mayank.xml"; 
     SerializeXmlWriter(pDomDocument,path); 

     return 0; 
} 

例外の下の取得:「キャッチxception:無効または不正なXML文字の下に

は私の正確なコードはまだ例外になっています"

+0

デフォルトでは、実装は名前空間を認識していない可能性があります。実装をどのように作成しますか? –

+0

'getDOMImplementation(XMLString :: transcode(" Core XML ")'は、名前空間をサポートしているかどうかを調べるために '' Core''だけが名前空間をサポートしているとは思わない –

+0

' ) 'は、DOM Level 1.0に名前空間のサポートが含まれていないので、名前空間が確実にサポートされる方法です。 –

答えて

1

Xercesサンプルに基づく例を示します、名前空間に要素を作成するだけです。サンプルは、Xercesの-C-3.1.1-x86ベースのWindows VC-10.0のバイナリリリースに対してコンパイル、ウィンドウ10の上に私のために正常に動作します:VS 2015とWindows上

#include "stdafx.h" 


// --------------------------------------------------------------------------- 
// Includes 
// --------------------------------------------------------------------------- 
#include <xercesc/util/PlatformUtils.hpp> 
#include <xercesc/util/XMLString.hpp> 
#include <xercesc/dom/DOM.hpp> 
#include <xercesc/util/OutOfMemoryException.hpp> 

#if defined(XERCES_NEW_IOSTREAMS) 
#include <iostream> 
#else 
#include <iostream.h> 
#endif 


XERCES_CPP_NAMESPACE_USE 

// --------------------------------------------------------------------------- 
// This is a simple class that lets us do easy (though not terribly efficient) 
// trancoding of char* data to XMLCh data. 
// --------------------------------------------------------------------------- 
class XStr 
{ 
public: 
    // ----------------------------------------------------------------------- 
    // Constructors and Destructor 
    // ----------------------------------------------------------------------- 
    XStr(const char* const toTranscode) 
    { 
     // Call the private transcoding method 
     fUnicodeForm = XMLString::transcode(toTranscode); 
    } 

    ~XStr() 
    { 
     XMLString::release(&fUnicodeForm); 
    } 


    // ----------------------------------------------------------------------- 
    // Getter methods 
    // ----------------------------------------------------------------------- 
    const XMLCh* unicodeForm() const 
    { 
     return fUnicodeForm; 
    } 

private: 
    // ----------------------------------------------------------------------- 
    // Private data members 
    // 
    // fUnicodeForm 
    //  This is the Unicode XMLCh format of the string. 
    // ----------------------------------------------------------------------- 
    XMLCh* fUnicodeForm; 
}; 

#define X(str) XStr(str).unicodeForm() 


// --------------------------------------------------------------------------- 
// main 
// --------------------------------------------------------------------------- 

int main(int argC, char*[]) 
{ 
    // Initialize the XML4C2 system. 
    try 
    { 
     XMLPlatformUtils::Initialize(); 
    } 

    catch (const XMLException& toCatch) 
    { 
     char *pMsg = XMLString::transcode(toCatch.getMessage()); 
     XERCES_STD_QUALIFIER cerr << "Error during Xerces-c Initialization.\n" 
      << " Exception message:" 
      << pMsg; 
     XMLString::release(&pMsg); 
     return 1; 
    } 

    // Watch for special case help request 
    int errorCode = 0; 
    if (argC > 1) 
    { 
     XERCES_STD_QUALIFIER cout << "\nUsage:\n" 
      " CreateDOMDocument\n\n" 
      "This program creates a new DOM document from scratch in memory.\n" 
      "It then prints the count of elements in the tree.\n" 
      << XERCES_STD_QUALIFIER endl; 
     errorCode = 1; 
    } 
    if (errorCode) { 
     XMLPlatformUtils::Terminate(); 
     return errorCode; 
    } 

    { 
     // Nest entire test in an inner block. 


     DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core")); 

     if (impl != NULL) 
     { 
      try 
      { 
       DOMDocument* doc = impl->createDocument(
        X("http://www.w3.org/2000/svg"),     // root element namespace URI. 
        X("svg:svg"),   // root element name 
        0);     // document type object (DTD). 

       doc->getDocumentElement()->appendChild(doc->createElementNS(X("http://www.w3.org/2000/svg"), X("svg:circle"))); 

       // 
       // Now count the number of elements in the above DOM tree. 
       // 

       const XMLSize_t elementCount = doc->getElementsByTagName(X("*"))->getLength(); 
       XERCES_STD_QUALIFIER cout << "The tree just created contains: " << elementCount 
        << " elements." << XERCES_STD_QUALIFIER endl; 

       DOMImplementationLS* lsImpl = (DOMImplementationLS*)impl; 
       DOMLSSerializer* ser = lsImpl->createLSSerializer(); 

       XERCES_STD_QUALIFIER wcout << ser->writeToString(doc); 

       doc->release(); 
       ser->release(); 
      } 
      catch (const OutOfMemoryException&) 
      { 
       XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" << XERCES_STD_QUALIFIER endl; 
       errorCode = 5; 
      } 
      catch (const DOMException& e) 
      { 
       XERCES_STD_QUALIFIER cerr << "DOMException code is: " << e.code << XERCES_STD_QUALIFIER endl; 
       errorCode = 2; 
      } 
      catch (...) 
      { 
       XERCES_STD_QUALIFIER cerr << "An error occurred creating the document" << XERCES_STD_QUALIFIER endl; 
       errorCode = 3; 
      } 
     } // (inpl != NULL) 
     else 
     { 
      XERCES_STD_QUALIFIER cerr << "Requested implementation is not supported" << XERCES_STD_QUALIFIER endl; 
      errorCode = 4; 
     } 
    } 

    XMLPlatformUtils::Terminate(); 
    return errorCode; 
} 

出力

The tree just created contains: 2 elements. 
<?xml version="1.0" encoding="UTF-16" standalone="no" ?><svg:svg xmlns:svg="http://www.w3.org/2000/svg"><svg:circle/></svg:svg> 
です

これはうまく動作し、あなたのスニペットで問題が発生しないと言います。

+0

問題が解決しました。私がStringからXMLChに変換するために使用していた関数が間違っていました。私は上記のコードに変更し、それは働いた。 –

関連する問題