From d71611d5fb575078bdf573c35257bb86bb7054e0 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 3 Dec 2009 17:02:56 +0200 Subject: Implement automatic mapping for urn-style XML namespaces --- xsd/cxx/elements.cxx | 27 ++++++++++++++++++++++----- xsd/cxx/elements.hxx | 4 ++++ 2 files changed, 26 insertions(+), 5 deletions(-) (limited to 'xsd') diff --git a/xsd/cxx/elements.cxx b/xsd/cxx/elements.cxx index 3cd5e9e..fd23fc0 100644 --- a/xsd/cxx/elements.cxx +++ b/xsd/cxx/elements.cxx @@ -144,6 +144,8 @@ namespace CXX cxx_id_expr_ (L"^(::)?([a-zA-Z_]\\w*)(::[a-zA-Z_]\\w*)*$"), cxx_id_expr (cxx_id_expr_), trace_namespace_regex (trace_namespace_regex_), + urn_mapping_ (L"#^urn.*:([a-zA-Z_].*)$#$1#"), + urn_mapping (urn_mapping_), nsr_mapping (nsr_mapping_), nsm_mapping (nsm_mapping_), include_mapping (include_mapping_), @@ -352,22 +354,37 @@ namespace CXX if (!found) { + String const& n (ns.name ()); + // Check if the name is valid by itself. // - if (ns.name ().empty ()) + if (n.empty ()) { // Empty name denotes a no-namespace case. // - tmp = ns.name (); + tmp = n; } else { - tmp = colon.merge (ns.name ()); // replace `/' with `::' + tmp = colon.merge (n); // replace `/' with `::' if (!cxx_id_expr.match (tmp)) { - throw NoNamespaceMapping ( - ns.file (), ns.line (), ns.column (), ns.name ()); + // See if this is a urn-style namespace. + // + if (urn_mapping.match (n)) + { + Regex filter (L"#[.:-]#_#"); + tmp = urn_mapping.merge (n); + tmp = filter.merge (tmp); + + if (!cxx_id_expr.match (tmp)) + throw NoNamespaceMapping ( + ns.file (), ns.line (), ns.column (), ns.name ()); + } + else + throw NoNamespaceMapping ( + ns.file (), ns.line (), ns.column (), ns.name ()); } } } diff --git a/xsd/cxx/elements.hxx b/xsd/cxx/elements.hxx index e478234..39eee77 100644 --- a/xsd/cxx/elements.hxx +++ b/xsd/cxx/elements.hxx @@ -152,6 +152,7 @@ namespace CXX xs_ns_ (c.xs_ns_), cxx_id_expr (c.cxx_id_expr), trace_namespace_regex (c.trace_namespace_regex), + urn_mapping (c.urn_mapping), nsr_mapping (c.nsr_mapping), nsm_mapping (c.nsm_mapping), include_mapping (c.include_mapping), @@ -176,6 +177,7 @@ namespace CXX xs_ns_ (c.xs_ns_), cxx_id_expr (c.cxx_id_expr), trace_namespace_regex (c.trace_namespace_regex), + urn_mapping (c.urn_mapping), nsr_mapping (c.nsr_mapping), nsm_mapping (c.nsm_mapping), include_mapping (c.include_mapping), @@ -338,8 +340,10 @@ namespace CXX RegexPat const cxx_id_expr_; RegexPat const& cxx_id_expr; Boolean trace_namespace_regex; + Regex urn_mapping_; RegexMapping nsr_mapping_; MapMapping nsm_mapping_; + Regex const& urn_mapping; RegexMapping const& nsr_mapping; MapMapping const& nsm_mapping; MappingCache ns_mapping_cache_; -- cgit v1.1