Centralize indentation spaces for xml representation with
define macro 'ANNA_XML_INDENTATION_SPACES' which is 3.
Add new working mode for xml Compiler: Sort. This one will
sort attribute names within nodes. This eases normalization
to match regexps based on xml diameter messages representation.
As this mode is based on bit mask, must be power of 2 and the
next free is 8.
// For cstd0x compatibility we will use stdint.h types instead of std:: ones on cstdint:
//#include <cstdint> when C++11 available
// For cstd0x compatibility we will use stdint.h types instead of std:: ones on cstdint:
//#include <cstdint> when C++11 available
+// For xml representations (xml::Compiler and json::functions::json2xml)
+#define ANNA_XML_INDENTATION_SPACES 3
+
// Decoding helpers
#define DECODE2BYTES_INDX_VALUETYPE(buffer,indx,value_type) ((((value_type)buffer[indx] << 8) & 0xFF00) + ((value_type)buffer[indx+1] & 0x00FF))
// Decoding helpers
#define DECODE2BYTES_INDX_VALUETYPE(buffer,indx,value_type) ((((value_type)buffer[indx] << 8) & 0xFF00) + ((value_type)buffer[indx+1] & 0x00FF))
#include <anna/core/RuntimeException.hpp>
#include <anna/core/mt/Mutex.hpp>
#include <anna/core/RuntimeException.hpp>
#include <anna/core/mt/Mutex.hpp>
-// Three-space tabulator for xml string presentation (node indent)
-#define ANNA_XML_COMPILER_TAB " "
Visual = 0, /**< Separa cada uno de los componentes con espacios y retornos de carro */
Compact = 1, /**< Los componentes no tienen separacion entre si. Se puede usar para optimizar envios de mensajes */
ShowNullAttribute = 2, /**< Visualiza el valor nulo de un atributo como ="" */
Visual = 0, /**< Separa cada uno de los componentes con espacios y retornos de carro */
Compact = 1, /**< Los componentes no tienen separacion entre si. Se puede usar para optimizar envios de mensajes */
ShowNullAttribute = 2, /**< Visualiza el valor nulo de un atributo como ="" */
- NoNamespaces = 4 /**<Obtiene el documento XML sin ofrecer informaciĆ³n sobre los namespaces */
+ NoNamespaces = 4, /**<Obtiene el documento XML sin ofrecer informaciĆ³n sobre los namespaces */
+ Sort = 8, /** Sorts attribute names */
static const Attribute* find(const char* attrName, const_attribute_iterator, const_attribute_iterator) throw();
static const Attribute* find(const char* attrName, const_attribute_iterator, const_attribute_iterator) throw();
+ // Allow sort in compiler
+ attribute_iterator attribute_begin() throw() { return a_attributes.begin(); }
+ attribute_iterator attribute_end() throw() { return a_attributes.end(); }
+
friend class Parser;
friend class Allocator<Node>;
friend class XPath;
friend class Decompressor;
friend class Parser;
friend class Allocator<Node>;
friend class XPath;
friend class Decompressor;
#include <anna/core/mt/Guard.hpp>
#include <anna/core/mt/Guard.hpp>
+#include <anna/core/util/defines.hpp>
#include <anna/xml/Compiler.hpp>
#include <anna/xml/Node.hpp>
#include <anna/xml/Compiler.hpp>
#include <anna/xml/Node.hpp>
#include <anna/xml/Document.hpp>
#include <anna/xml/Namespace.hpp>
#include <anna/xml/Document.hpp>
#include <anna/xml/Namespace.hpp>
+#include <algorithm>
+#include <cstring>
+
+
using namespace anna;
using namespace anna::xml;
using namespace anna;
using namespace anna::xml;
const Namespace* ns;
for(int i = 0; i < level; i ++)
const Namespace* ns;
for(int i = 0; i < level; i ++)
- result += ANNA_XML_COMPILER_TAB;
+ result += std::string(ANNA_XML_INDENTATION_SPACES, ' ');
result += '<';
writeFullName(node, result, flags);
result += '<';
writeFullName(node, result, flags);
+ // Sort node attributes (this is a compiler used for on-demand representation, this sorting is not permanent in the object which uses it):
+ if(flags & Mode::Sort) {
+ Node *nc_node = const_cast<Node*>(node);
+ std::sort(nc_node->attribute_begin(), nc_node->attribute_end(),
+ [](Attribute *a, Attribute *b) { return (std::strcmp(a->getName(), b->getName()) < 0); }); // sort alphabetically by attribute name
+ }
+
for(Node::const_attribute_iterator ii = node->attribute_begin(), maxii = node->attribute_end(); ii != maxii; ii ++) {
attribute = Node::attribute(ii);
result += ' ';
for(Node::const_attribute_iterator ii = node->attribute_begin(), maxii = node->attribute_end(); ii != maxii; ii ++) {
attribute = Node::attribute(ii);
result += ' ';
void Compiler::close(const Node* node, Result& result, const int level, const int flags)
throw(RuntimeException) {
for(int i = 0; i < level; i ++)
void Compiler::close(const Node* node, Result& result, const int level, const int flags)
throw(RuntimeException) {
for(int i = 0; i < level; i ++)
- result += ANNA_XML_COMPILER_TAB;
+ result += std::string(ANNA_XML_INDENTATION_SPACES, ' ');
result += "</";
writeFullName(node, result, flags);
result += "</";
writeFullName(node, result, flags);