2009-03-31 116 views
7

que tengo esta variable, un vector de punteros dobles como:crear archivos XML de programa en C++

vector<double*> myIntersections; 

que contiene un vector cuyos elementos son todos un vector bidimensional de dobles. Quiero crear un archivo XML (llamado por ejemplo miarchivo.axl - con esta extensión específica) en el que cada fila del archivo está dada por cada elemento del vector (por lo que en cada fila uno tendría elementos al menos vectoriales) [i] [0], vector [i] [1]) y las etiquetas del archivo XML son ..., etc. (definidas por el usuario). El archivo XML debe ser algo como:

<point name="intersectPoints" size="4" color="rgb"> 
    -2.68 1.82 0.0 255 0 0 
    -2.63 1.03 0.0 255 0 0 
</point> 

donde vector [0] [0] = - 2.68, vector [0] [1] = 1,82 y así sucesivamente (0,0 255 0 0 es siempre el mismo) Sé cómo escribir archivos en C++ (estaba pensando en usar la biblioteca fstream), pero no sé cómo crear las etiquetas XML (a menos que sea con cadenas de esta manera, se usarán cadenas) así que soy un un poco perdido.

cualquier sugerencia es más que bienvenida. gracias por su tiempo, Madalina

Respuesta

0

Suponiendo que usted está en Windows y el uso de Visual Studio, se puede usar MSXML u otras bibliotecas 3 ª parte.

+0

Estoy usando MacOSX. – madalina

0

he aquí un truco ...

cout << "<point name=\"intersectPoints\" size=\"4\" color=\"rgb\">"<<endl; 
cout << " "<<-2.68<<" "<<1.82<<" "<<0.0<<" "<<255<<" "<<0<<" "<<0<<""; 

ése es cómo escribir archivos XML con poca sobrecarga simplemente guardar en el archivo XML en bruto.

+1

Esto puede funcionar para documentos pequeños pero abre ampliamente la puerta a errores humanos. –

+0

-1 para crear su propio creador xml. –

+1

llámalo biblioteca y mantendrás los tipos más anales aquí ¡felices! –

5

Echa un vistazo TinyXml. Es extremadamente liviano A partir de la documentación:

TinyXML utiliza un Modelo de Objetos de Documento (DOM), lo que significa que los datos XML se analiza en un C++ objetos que pueden ser manipulados y buscan, y luego escribe en el disco o en otro flujo de salida. También puede construir un documento XML desde cero con objetos C++ y escribir esto en el disco u otra secuencia de salida.

He usado TinyXml en mis propios proyectos y es un placer usarlo.

Editar: Además de TinyXML, también uso ticpp (TinyXml ++) que presenta más funciones de C++ (excepciones, plantillas, iteradores, etc.) en la parte superior de la biblioteca.

7

Por favor. Por favor, no cree XML por su cuenta.

Utilice las bibliotecas que generarán un archivo XML válido y correcto.
Lo mismo está relacionado con la lectura de XML. No vas a leer XML con ifstream, ¿verdad? Entonces, si tiene una biblioteca XML para leer archivos XML, estoy bastante seguro de que esta biblioteca permite la creación de XML.

Aquí es código de ejemplo con tinyxml

int main() 
{ 
    VertexList vl; 

    vl.push_back(Vertex(Point3d(-2.68, 1.82, 0.0), RGB(255, 0, 0))); 
    vl.push_back(Vertex(Point3d(-2.63, 1.03, 0.0), RGB(255, 0, 0))); 

    std::ostringstream ss; 
    std::for_each(vl.begin(), vl.end(), VertexPrint(ss)); 

    // write xml 
    TiXmlDocument doc; 
    TiXmlDeclaration decl("1.0", "", ""); 
    doc.InsertEndChild(decl); 

    TiXmlElement point("point"); 

    TiXmlComment comment("My Points"); 
    point.InsertEndChild(comment); 

    point.SetAttribute("name", "intersectPoints"); 
    point.SetAttribute("size", vl.size()); 
    point.SetAttribute("color", "rgb"); 

    TiXmlText values(ss.str()); 
    point.InsertEndChild(values); 

    doc.InsertEndChild(point); 
    doc.SaveFile("out.xml"); 
} 

Dónde Vertex

struct Point3d 
{ 
    Point3d(double x, double y, double z): 
     x_(x), y_(y), z_(z) 
    {} 
    double x_; 
    double y_; 
    double z_; 
}; 
struct RGB 
{ 
    RGB(int r, int g, int b): 
     r_(r), g_(g), b_(b) 
    {} 
    int r_; 
    int g_; 
    int b_; 
}; 
struct Vertex 
{ 
    Vertex(const Point3d& coord, const RGB& color): 
     coord_(coord), color_(color) 
    {} 
    Point3d coord_; 
    RGB color_; 
}; 
typedef std::vector<Vertex> VertexList; 

y VertexPrint es

struct VertexPrint 
{ 
    VertexPrint(std::ostringstream& result): 
     result_(result) 
    {} 
    void operator() (const Vertex& v) 
    { 
     result_ << v.coord_.x_ <<" "<< v.coord_.y_ <<" "<< v.coord_.z_ <<" " 
       << v.color_.r_ <<" "<< v.color_.b_ <<" "<< v.color_.b_ <<";"; 
    } 
    std::ostringstream& result_; 
}; 

También puede considerar boost XML serialization

+0

Leer y escribir no son remotamente similares. Por ejemplo, es trivial escribir un programa para emitir código C++. No es trivial escribir un analizador de C++. –

+0

Acababa de publicar: "Por favor, no cree XML". ;) – grieve

+0

No vi XML parser que solo puede leer o solo escribir. Ese fue mi punto. –

0

estoy mirando TinyXML ahora. Lo he descargado, espero poder instalarlo. Utilizo MacOSX, puedo ver que el Makefile para Linux también se probó con éxito para MacOSX, así que intentaré instalarlo y, si se instaló con éxito, trabajé con él.

0

Para algo tan simple como este, escribir las etiquetas directamente no sería muy complicado:

void WriteToFile(fstream& file, vector<double *> intersections) 
{ 
    file << "<point"; 
    file << " name=\"intersectPoints\""; 
    file << " size=\"" << intersections.size() "\""; 
    file << " color=\"rgb\"" 
    file << ">\n" 

    vector<double *>::iterator it; 
    for (it=intersections.begin(); it != intersections.end(); it++) 
    { 
     file << (*it)[0] << " " << (*it)[1] << " " << (*it)[2] << " "; 
     file << "255 0 0\n"; 
    } 

    file << "</point>" << endl; 
} 
1

Si se acaba escribiendo XML, un analizador completo soplado es una exageración. Mejor mira algo como Genx

+0

O eche un vistazo a la biblioteca de C++ [libstudxml] (http://codesynthesis.com/projects/libstudxml/) que usa Genx internamente. –

1

He usado xerces para generar archivos XML, y es muy caro en términos de uso de memoria y CPU. Eventualmente obtuve excepciones de "memoria insuficiente" tratando de generar archivos con solo unos pocos cientos de miles de líneas de XML. Si puede salirse con la suya generando directamente como han sugerido algunas otras respuestas, y como su pregunta implica que debería ser posible, yo iría por esa ruta. Leer y analizar es una historia diferente, pero usar xerces para generar XML es excesivo.

Cuestiones relacionadas