En mi programa C++ quiero analizar una pequeña porción de XML, insertar algunos nodos y luego extraer el nuevo XML (preferiblemente como std::string
).
RapidXml me ha sido recomendado, pero no puedo ver cómo recuperar el XML como una cadena de texto.
(Pude iterar sobre los nodos y atributos y construirlo yo mismo, pero seguramente hay una versión en la función que me falta).
Gracias.C++: Cómo extraer una cadena de RapidXml
Respuesta
Aunque la documentación es pobre en este tema, logré obtener algún código de funcionamiento mirando la fuente. Aunque le falta el encabezado xml que normalmente contiene información importante. He aquí un pequeño ejemplo de programa que hace lo que está buscando usando rapidxml:
#include <iostream>
#include <sstream>
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_print.hpp"
int main(int argc, char* argv[]) {
char xml[] = "<?xml version=\"1.0\" encoding=\"latin-1\"?>"
"<book>"
"</book>";
//Parse the original document
rapidxml::xml_document<> doc;
doc.parse<0>(xml);
std::cout << "Name of my first node is: " << doc.first_node()->name() << "\n";
//Insert something
rapidxml::xml_node<> *node = doc.allocate_node(rapidxml::node_element, "author", "John Doe");
doc.first_node()->append_node(node);
std::stringstream ss;
ss <<*doc.first_node();
std::string result_xml = ss.str();
std::cout <<result_xml<<std::endl;
return 0;
}
Si todavía no está comprometido con XML rápido, puedo recomendar algunas bibliotecas alternativas:
Xerces - Esta es probablemente la aplicación de facto de C++.
XMLite - He tenido un poco de suerte con esta implementación XML mínima. Ver el artículo en http://www.codeproject.com/KB/recipes/xmlite.aspx
Si construye XML a sí mismo, no se olvide de escapar los caracteres especiales. Esto tiende a ser pasado por alto, pero puede causar algunos dolores de cabeza graves si no se implementa:
- < & lt;
- > & gt;
- & & amp;
- " & quot;
- ' & apos;
continuación se explica cómo imprimir un nodo en una cadena recta desde el RapidXML Manual:
xml_document<> doc; // character type defaults to char
// ... some code to fill the document
// Print to stream using operator <<
std::cout << doc;
// Print to stream using print function, specifying printing flags
print(std::cout, doc, 0); // 0 means default printing flags
// Print to string using output iterator
std::string s;
print(std::back_inserter(s), doc, 0);
// Print to memory buffer using output iterator
char buffer[4096]; // You are responsible for making the buffer large enough!
char *end = print(buffer, doc, 0); // end contains pointer to character after last printed character
*end = 0; // Add string terminator after XML
rapidxml :: impresión reuqires un iterador de salida para generar la salida, por lo que una cadena de caracteres trabaja con él.Pero esto es arriesgado porque no puedo saber si una matriz con longitud fija (como 2048 bytes) es lo suficientemente larga como para contener todo el contenido del XML.
La forma correcta de hacer esto es pasar un iterador de salida de una secuencia de cadena para permitir que el búfer se expanda cuando el XML se está volcando en él.
Mi código es como a continuación:
std::stringstream stream;
std::ostream_iterator<char> iter(stream);
rapidxml::print(iter, doc, rapidxml::print_no_indenting);
printf("%s\n", stream.str().c_str());
printf("len = %d\n", stream.str().size());
Uso static_cast <>
Ex:
rapidxml::xml_document<> doc;
rapidxml::xml_node <> * root_node = doc.first_node();
std::string strBuff;
doc.parse<0>(xml);
.
.
.
strBuff = static_cast<std::string>(root_node->first_attribute("attribute_name")->value());
que sigue es muy fácil,
std::string s;
print(back_inserter(s), doc, 0);
cout << s;
Sólo es necesario incluye "rapidxml" _print.hpp "encabezado en su código fuente.
- 1. cómo extraer una cadena Unicode con Boost.Python
- 2. Cómo analizar el archivo XML en RapidXML
- 3. Bash: extraer parte de una cadena
- 4. cómo hacer extraer número decimal de cadena en C#
- 5. Cómo solucionar problemas de propiedad de RapidXML String?
- 6. manera más eficiente de extraer una cadena
- 7. extraer cadena de consulta de una cadena de URL
- 8. cómo extraer la subcadena de una cadena hasta que encuentre una coma C# asp.net
- 9. Cómo extraer un número flotante de una cadena
- 10. ¿Cómo puedo extraer subcadenas de una cadena en Perl?
- 11. ¿Cómo extraer un número de una cadena en Perl?
- 12. Extraer tiempo de fecha Cadena
- 13. Extraer una cadena a partir de una trama de datos
- 14. extraer una subcadena en C
- 15. Ruby: Extraer palabras de Cadena
- 16. ¿Cómo se obtiene la cadena restante después de extraer una cadena de una variable sstream?
- 17. Cómo extraer el contenido de corchetes en una cadena de texto en C# usando Regex
- 18. Cómo extraer cadena del paquete en onResume()?
- 19. Extraer cadena de entre las citas
- 20. ¿Cómo extraer una cadena entre otras 2 cadenas en python?
- 21. Objetivo C: ¿Cómo extraer parte de una cadena (por ejemplo, comenzar con '#')
- 22. Uso de expresiones regulares para extraer información de una cadena
- 23. extraer primero 4 letras de una cadena en matlab
- 24. extraer la primera palabra de una cadena - expresiones regulares
- 25. php para extraer una cadena de comillas dobles
- 26. C# - ¿Cómo puedo extraer una imagen de disco FAT?
- 27. expresión regular para extraer texto de una cadena RTF
- 28. ¿Cómo obtener una cadena terminada nula de una cadena C#?
- 29. Extraer tokens de una cadena con expresiones regulares en .NET
- 30. Extraer solo caracteres de una cadena en Python
Simplemente no olvide las pocas penalidades de velocidad del cien por ciento para estas bibliotecas, aunque ambas tienen muchas más características que RapidXML. –
vtd-xml es una lib más que es más conforme y potente que rapidXML –