Hi,

I thought if I'd just start implementing this, it'd help you more than a 300-word reply.

I skimmed the spec very quick and from what I gather, you want an <any> tag instead of an <element> tag inside the <complexType><sequence> (...) </complexType></sequence> hierarchy, right? (correct me if i'm wrong here.)

if so, here's the patch that is a nice starting point:

diff --git a/src/rpclib/interface/xml_schema/model/complex.py b/src/rpclib/interface/xml_schema/model/complex.py
index f99f587..ae0d65c 100644
--- a/src/rpclib/interface/xml_schema/model/complex.py
+++ b/src/rpclib/interface/xml_schema/model/complex.py
@@ -22,6 +22,7 @@ from lxml import etree
 from rpclib.const import xml_ns as namespace
 from rpclib.model import ModelBase
 from rpclib.model.complex import XmlAttribute
+from rpclib.model.primitive import AnyXml
 from rpclib.util.etreeconv import dict_to_etree

 def complex_add(interface, cls):
@@ -82,9 +83,21 @@ def complex_add(interface, cls):
             if v != cls:
                 interface.add(v)

- member = etree.SubElement(sequence, '{%s}element' % namespace.xsd)
-            member.set('name', k)
-            member.set('type', v.get_type_name_ns(interface))
+            member = etree.SubElement(sequence, v.Attributes.schema_tag)
+            if v.Attributes.schema_tag == '{%s}element' % namespace.xsd:
+                member.set('name', k)
+                member.set('type', v.get_type_name_ns(interface))
+
+            elif v.Attributes.schema_tag == '{%s}any' % namespace.xsd and \
+                    (v is AnyXml or
+ (hasattr(v, '_is_clone_of') and v._is_clone_of is AnyXml)):
+                if v.Attributes.namespace is not None:
+                    member.set('namespace', v.Attributes.namespace)
+                if v.Attributes.process_contents is not None:
+ member.set('processContents', v.Attributes.process_contents)
+
+            else:
+ raise ValueError("Unhandled schema_tag / type combination.")

             if v.Attributes.min_occurs != 1: # 1 is the xml schema default
                 member.set('minOccurs', str(v.Attributes.min_occurs))
diff --git a/src/rpclib/model/_base.py b/src/rpclib/model/_base.py
index 32d5fe7..abf80b1 100644
--- a/src/rpclib/model/_base.py
+++ b/src/rpclib/model/_base.py
@@ -89,6 +89,10 @@ class ModelBase(object):
will imply an iterable of objects as native python type. Can be set to
         ``float("inf")`` for arbitrary number of arguments."""

+        schema_tag = '{%s}element' % rpclib.const.xml_ns.xsd
+ """The tag used to add a primitives as child to a complex type in the
+        xml schema."""
+
     class Annotations(object):
         """The class that holds the annotations for the given type."""

diff --git a/src/rpclib/model/primitive.py b/src/rpclib/model/primitive.py
index 9fc2b6a..9ee2a94 100644
--- a/src/rpclib/model/primitive.py
+++ b/src/rpclib/model/primitive.py
@@ -74,6 +74,13 @@ class AnyXml(SimpleModel):

     __type_name__ = 'anyType'

+    class Attributes(SimpleModel.Attributes):
+        namespace = None
+        """Xml-Schema specific namespace attribute"""
+
+        process_contents = None
+        """Xml-Schema specific processContents attribute"""
+
     @classmethod
     @nillable_string
     def to_string(cls, value):


The first hunk makes the element tag name parametric.

The second hunk adds the parameter to the ModelBase class.

So if you want an <any> tag instead of an <element> tag inside a complexType definition, you need to do this:

class SomeType(ComplexModel):
child = AnyXml(schema_tag='{%s}any' % rpclib.const.xml_ns.xsd, namespace='##other')

This is totally off the top of my head, but I guess you get the idea.

Does this help? Let me know how it goes.

best,
burak

On 03/29/12 19:32, Alex Railean wrote:
3. change the code that generates a Python object from XML

there's no such thing in rpclib. we don't parse xml schema, only generate it.


    - I think it can rely on validate_native, but my understanding is
      that I must also define the behaviour of validate_native for this
      type - I don't know where to do that


You need to re-implement any additional validation that the the schema validation does in the soft validator as well. In this case, I agree that validate_native in AnyXml is the right place to do it.


_______________________________________________
Soap mailing list
[email protected]
http://mail.python.org/mailman/listinfo/soap

Reply via email to