2012-05-20 5 views
0

У меня возникла проблема, когда я сериализую объект в строку и затем создаю его снова из той же строки. Когда я пытаюсь создать один и тот же объект из строки и проверять значения, функции возвращаются неправильно. Он возвращает весь XML-объект в виде строки.xerces c проблема с созданием объекта из только что сериализованного объекта

Я посмотрел на полученный xml, и он выглядит правильно. Поэтому я не понимаю, что делать.

Благодарим за понимание этого вопроса.

Приведенный ниже пример.

#include "XMLHelper.hxx" 

void serializeObject(XmlHelper::Object& mess, std::string& result); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    XmlHelper::objectType oType(XmlHelper::objectType::Status); 
    XmlHelper::Object obj(oType); 

    unsigned long time(134000000); 
    XmlHelper::Status status(time); 
    obj.status().set(status); 

    std::string result; 

    serializeObject(obj, result); 


    if (obj.status().present() ) 
    { 
    std::cout<<"Message is Status"<<std::endl; 
    } 
    if (obj.objectType() == "Status") 
    { 
    std::cout<<"Message is Status"<<std::endl; 
    } 
    if (obj.objectType() == XmlHelper::objectType::Status) 
    { 
    std::cout<<"Message is Status"<<std::endl; 
    } 

    XmlHelper::Object otherObj(result); 

    if (otherObj.status().present() ) 
    { 
    std::cout<<"Message is Status"<<std::endl; 
    } 
    else if (otherObj.objectType() == "ThingA") 
    { 
    std::cout<<"Message is ThingA"<<std::endl; 
    } 
    else if (otherObj.objectType() == "ThingB") 
    { 
    std::cout<<"Message is ThingB"<<std::endl; 
    } 

    return 0; 
} 

void serializeObject(XmlHelper::Object& mess, std::string& result) 
{ 

    std::ostringstream buff; 
    xml_schema::namespace_infomap nsm; 

    nsm[""].schema = "XMLHelper.xsd"; 

    Object_(buff, mess, nsm, "UTF-8", xml_schema::flags::no_xml_declaration); 

    result=buff.str(); 

} 

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 

    <!--<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.com/TENAXML">--> 


    <xsd:complexType name ="Status" > 
    <xsd:sequence> 
     <xsd:element name="timeOfUpdate" type="xsd:unsignedLong" minOccurs="1" maxOccurs="1"/> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name ="ThingA" > 
    <xsd:sequence> 
     <xsd:element name="number" type="xsd:unsignedLong" minOccurs="1" maxOccurs="1"/> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name ="ThingB" > 
    <xsd:sequence> 
     <xsd:element name="number" type="xsd:unsignedLong" minOccurs="1" maxOccurs="1"/> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:simpleType name="objectType"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:enumeration value="Status"/> 
     <xsd:enumeration value="ThingA"/> 
     <xsd:enumeration value="ThingB"/> 
    </xsd:restriction> 
    </xsd:simpleType> 

    <xsd:complexType name="Object" > 
    <xsd:sequence> 
     <xsd:element name="objectType" type ="objectType" minOccurs="1" maxOccurs="1" /> 
     <xsd:element name ="thingA" type ="ThingA" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name ="thingB" type ="ThingB" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name ="status" type ="Status" minOccurs="0" maxOccurs="1"/> 
    </xsd:sequence> 

    </xsd:complexType > 

    <xsd:element name="Object" type="Object" /> 
</xsd:schema> 

ответ

1

Приходите, чтобы узнать, что я делал здание объекта, который полностью анализирует XML. То, что кажется правильным, - это ниже.

std::istringstream iss (result); 
std::auto_ptr<XmlHelper::Object> otherObj(XmlHelper::Object_(iss)); 

У меня также не было файла xsd в правильном каталоге.

Надеюсь, это поможет кому-то еще.