Thanks for your quick response and help.

Using a nondefault namespace for the root node seems to have solved the 
problem, i.e. the generated doc looks like:

<?xml version="1.0" encoding="UTF-8"?>
<test_ns:testInstance xmlns:test_ns="http://localhost/test_namespace";>
  <element1>foo</element1>
  <element2>1</element2>
</test_ns:testInstance>

However setting the namespace of the children to anything other than the result 
of xmlNewNs(NULL, NULL, NULL), I still run into the same problem.  

If I pass NULL as the namespace argument for the children, then it inherits 
from the root_node and the result is:
element element1: Schemas validity error : Element 
'{http://localhost/test_namespace}element1': This element is not expected. 
Expected is ( element1 ).
generated doc is invalid

Likewise if I try to set it to some non-NULL value I get a similar error saying 
that the element was not expected to have that namespace.

thanks again,
pat

-----Original Message-----
From: Daniel Veillard [mailto:[email protected]]
Sent: Wed 9/8/2010 5:22 AM
To: Patrick McClory
Cc: [email protected]; Joshua Brindle
Subject: Re: [xml] libxml .xsd validation problem
 
On Tue, Sep 07, 2010 at 04:35:54PM -0400, Patrick McClory wrote:
> Hello,
> 
> I'm working on a project which requires validation of xml documents against 
> .xsd schemas.  We both create xml documents from scratch, and create xml docs 
> from char * buffers read from a socket.  I've run into trouble validating the 
> docs created from buffers, even when the buffers are generated from a 
> document that already validated successfully.


>         //set the namespace
>         root_node->ns = xmlNewNs(root_node, BAD_CAST 
> "http://localhost/test_namespace";, NULL);
>         root_node->nsDef = root_node->ns;

  From a tree perspective the root has a namespace, which is defined
as a default namespace

>         //create the children
>         xmlNsPtr child_ns = xmlNewNs(NULL, NULL, NULL);

  have you checked what this returns ? What is that supposed to mean ?

>         xmlNewChild(root_node, child_ns, BAD_CAST "element1", BAD_CAST "foo");
>         xmlNewChild(root_node, child_ns, BAD_CAST "element2", BAD_CAST "1");

  while the children have a namespace which is basically not defined.

>         xmlSaveFormatFileEnc("generated.xml", doc, "UTF-8", 1);


> I dump both docs to output files (generated.xml and buffer.xml), and I 
> confirmed that they're the same on disk using diff.

  when you serialize, I bet the child_ns does not appear.

> The problem seems to be that when libxml reads from the buffer it attaches 
> the parent namespace to the children (if it isn't specified), which later 
> causes validation to fail.  Is this a common problem?  Is there a standard 
> workaround for this?

The problem is that basically you defined the root namespace as a
default namespace (no prefix), that the broken namespace used for the
children is not serialized and as a result the output document have
the children inheriting the default namespace from root.

Don't use a default namespace on the root. and fix the children
namespace definition.

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
[email protected]  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/

_______________________________________________
xml mailing list, project page  http://xmlsoft.org/
[email protected]
http://mail.gnome.org/mailman/listinfo/xml

Reply via email to