* XML/Ada schema validation and XML namespaces
@ 2013-04-08 19:58 J Kimball
2013-04-08 20:00 ` J Kimball
2013-04-09 11:45 ` Simon Wright
0 siblings, 2 replies; 5+ messages in thread
From: J Kimball @ 2013-04-08 19:58 UTC (permalink / raw)
Hello
I'm having the derndest time figuring out how to validate XML using
namespaces against a schema with XML/Ada. I seem to recall that doing
away with namespaces makes it work. After all the debug junk I don't
care about scrolls past, I see:
Validation_Error: Attribute "xmlns:agent" invalid for type
{http://singo1.com/schemas/agent}agent-message
Exception name: SCHEMA.VALIDATORS.XML_VALIDATION_ERROR
it seems like an issue with XML/Ada. Can you tell me if I'm missing a
feature to enable, something about XML that I'm missing or just wrong
code or an example that is using namespaces that works?
Some XML (agent.xml):
<?xml version="1.0"?>
<agent:response xmlns:agent="http://example.com/schemas/agent">
<agent:message>Zerg</agent:message>
</agent:response>
A schema (agent.xsd):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://singo1.com/schemas/agent"
xmlns:agent="http://example.com/schemas/agent">
<xs:element name="response" type="agent:agent-message"/>
<xs:complexType name="agent-message">
<xs:sequence>
<xs:element ref="agent:message"/>
</xs:sequence>
</xs:complexType>
<xs:element name="message" type="xs:string"/>
</xs:schema>
For those who are so inclined, I generated the XML schema from a RelaxNG
schema (agent.rng) with trang:
<?xml version="1.0"?>
<rng:grammar
xmlns:rng="http://relaxng.org/ns/structure/1.0"
xmlns:a="http://relaxng.org/ns/annotation/1.0"
xmlns:agent="http://example.com/schemas/agent"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<rng:start>
<rng:ref name="agent-response" />
</rng:start>
<rng:define name="agent-response">
<a:documentation>A response from a client.</a:documentation>
<rng:element name="agent:response">
<rng:ref name="agent-message" />
</rng:element>
</rng:define>
<rng:define name="agent-message">
<a:documentation>A simple message.</a:documentation>
<rng:element name="agent:message"><rng:data type="string"
/></rng:element>
</rng:define>
</rng:grammar>
% trang agent.rng agent.xsd
agent.xml validates successfully against both schemas using jing and
xmllint:
% jing agent.rng agent.xml
% xmllint --relaxng agent.rng agent.xml
% xmllint --schema agent.xsd agent.xml
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: XML/Ada schema validation and XML namespaces
2013-04-08 19:58 XML/Ada schema validation and XML namespaces J Kimball
@ 2013-04-08 20:00 ` J Kimball
2013-04-09 11:45 ` Simon Wright
1 sibling, 0 replies; 5+ messages in thread
From: J Kimball @ 2013-04-08 20:00 UTC (permalink / raw)
There is a minor error in the XML schema. The correct schema is:
A schema (agent.xsd):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://example.com/schemas/agent"
xmlns:agent="http://example.com/schemas/agent">
<xs:element name="response" type="agent:agent-message"/>
<xs:complexType name="agent-message">
<xs:sequence>
<xs:element ref="agent:message"/>
</xs:sequence>
</xs:complexType>
<xs:element name="message" type="xs:string"/>
</xs:schema>
On 04/08/2013 02:58 PM, J Kimball wrote:
> Hello
>
> I'm having the derndest time figuring out how to validate XML using
> namespaces against a schema with XML/Ada. I seem to recall that doing
> away with namespaces makes it work. After all the debug junk I don't
> care about scrolls past, I see:
>
> Validation_Error: Attribute "xmlns:agent" invalid for type
> {http://singo1.com/schemas/agent}agent-message
> Exception name: SCHEMA.VALIDATORS.XML_VALIDATION_ERROR
>
> it seems like an issue with XML/Ada. Can you tell me if I'm missing a
> feature to enable, something about XML that I'm missing or just wrong
> code or an example that is using namespaces that works?
>
> Some XML (agent.xml):
>
> <?xml version="1.0"?>
>
> <agent:response xmlns:agent="http://example.com/schemas/agent">
> <agent:message>Zerg</agent:message>
> </agent:response>
>
> A schema (agent.xsd):
>
> <?xml version="1.0" encoding="UTF-8"?>
>
> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
> elementFormDefault="qualified"
> targetNamespace="http://singo1.com/schemas/agent"
> xmlns:agent="http://example.com/schemas/agent">
> <xs:element name="response" type="agent:agent-message"/>
> <xs:complexType name="agent-message">
> <xs:sequence>
> <xs:element ref="agent:message"/>
> </xs:sequence>
> </xs:complexType>
> <xs:element name="message" type="xs:string"/>
> </xs:schema>
>
> For those who are so inclined, I generated the XML schema from a RelaxNG
> schema (agent.rng) with trang:
>
> <?xml version="1.0"?>
>
> <rng:grammar
> xmlns:rng="http://relaxng.org/ns/structure/1.0"
> xmlns:a="http://relaxng.org/ns/annotation/1.0"
> xmlns:agent="http://example.com/schemas/agent"
> datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
>
> <rng:start>
> <rng:ref name="agent-response" />
> </rng:start>
>
> <rng:define name="agent-response">
> <a:documentation>A response from a client.</a:documentation>
>
> <rng:element name="agent:response">
> <rng:ref name="agent-message" />
> </rng:element>
> </rng:define>
>
> <rng:define name="agent-message">
> <a:documentation>A simple message.</a:documentation>
>
> <rng:element name="agent:message"><rng:data type="string"
> /></rng:element>
> </rng:define>
>
> </rng:grammar>
>
> % trang agent.rng agent.xsd
>
> agent.xml validates successfully against both schemas using jing and
> xmllint:
>
> % jing agent.rng agent.xml
> % xmllint --relaxng agent.rng agent.xml
> % xmllint --schema agent.xsd agent.xml
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: XML/Ada schema validation and XML namespaces
2013-04-08 19:58 XML/Ada schema validation and XML namespaces J Kimball
2013-04-08 20:00 ` J Kimball
@ 2013-04-09 11:45 ` Simon Wright
2013-04-10 17:42 ` J Kimball
1 sibling, 1 reply; 5+ messages in thread
From: Simon Wright @ 2013-04-09 11:45 UTC (permalink / raw)
J Kimball <nntp@kmbll.com> writes:
> I'm having the derndest time figuring out how to validate XML using
> namespaces against a schema with XML/Ada. I seem to recall that doing
> away with namespaces makes it work. After all the debug junk I don't
> care about scrolls past, I see:
>
> Validation_Error: Attribute "xmlns:agent" invalid for type
> {http://singo1.com/schemas/agent}agent-message
> Exception name: SCHEMA.VALIDATORS.XML_VALIDATION_ERROR
>
> it seems like an issue with XML/Ada. Can you tell me if I'm missing a
> feature to enable, something about XML that I'm missing or just wrong
> code or an example that is using namespaces that works?
I think you may have been using the AdaCore documentation at [1]?
If so, I think the problem is that the examples in 6.4, 6.5 don't
actually set the grammar to be used by the reader; in 6.3 there's a
declare block which shows you how to do it, eg
with Sax.Readers; use Sax.Readers;
with Schema.Readers; use Schema.Readers;
with Schema.Schema_Readers; use Schema.Schema_Readers;
with Schema.Validators; use Schema.Validators;
with Input_Sources.File; use Input_Sources.File;
with Ada.Text_IO; use Ada.Text_IO;
procedure SchemaExample is
Grammar : XML_Grammar;
Schema : Schema_Reader;
Input : File_Input;
My_Reader : Validating_Reader;
begin
Open ("agent.xsd", Input);
Parse (Schema, Input);
Close (Input);
Grammar := Get_Grammar (Schema);
Set_Public_Id (Input, "Agent file");
Open ("agent.xml", Input);
Set_Grammar (My_Reader, Grammar);
Set_Feature (My_Reader, Schema_Validation_Feature, True);
Parse (My_Reader, Input);
Close (Input);
Put_Line ("OK.");
end SchemaExample;
which outputs "OK.".
I'm about to report this problem to AdaCore.
[1] http://docs.adacore.com/xmlada-docs/schema.html
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: XML/Ada schema validation and XML namespaces
2013-04-09 11:45 ` Simon Wright
@ 2013-04-10 17:42 ` J Kimball
2013-04-10 19:56 ` Simon Wright
0 siblings, 1 reply; 5+ messages in thread
From: J Kimball @ 2013-04-10 17:42 UTC (permalink / raw)
On 04/09/2013 06:45 AM, Simon Wright wrote:
> J Kimball <nntp@kmbll.com> writes:
>
>> I'm having the derndest time figuring out how to validate XML using
>> namespaces against a schema with XML/Ada. I seem to recall that doing
>> away with namespaces makes it work. After all the debug junk I don't
>> care about scrolls past, I see:
>>
>> Validation_Error: Attribute "xmlns:agent" invalid for type
>> {http://singo1.com/schemas/agent}agent-message
>> Exception name: SCHEMA.VALIDATORS.XML_VALIDATION_ERROR
>>
>> it seems like an issue with XML/Ada. Can you tell me if I'm missing a
>> feature to enable, something about XML that I'm missing or just wrong
>> code or an example that is using namespaces that works?
>
> I think you may have been using the AdaCore documentation at [1]?
>
> If so, I think the problem is that the examples in 6.4, 6.5 don't
> actually set the grammar to be used by the reader; in 6.3 there's a
> declare block which shows you how to do it, eg
>
> with Sax.Readers; use Sax.Readers;
> with Schema.Readers; use Schema.Readers;
> with Schema.Schema_Readers; use Schema.Schema_Readers;
> with Schema.Validators; use Schema.Validators;
> with Input_Sources.File; use Input_Sources.File;
>
> with Ada.Text_IO; use Ada.Text_IO;
>
> procedure SchemaExample is
> Grammar : XML_Grammar;
> Schema : Schema_Reader;
> Input : File_Input;
> My_Reader : Validating_Reader;
> begin
> Open ("agent.xsd", Input);
> Parse (Schema, Input);
> Close (Input);
>
> Grammar := Get_Grammar (Schema);
>
> Set_Public_Id (Input, "Agent file");
> Open ("agent.xml", Input);
>
> Set_Grammar (My_Reader, Grammar);
> Set_Feature (My_Reader, Schema_Validation_Feature, True);
> Parse (My_Reader, Input);
>
> Close (Input);
>
> Put_Line ("OK.");
> end SchemaExample;
>
> which outputs "OK.".
>
> I'm about to report this problem to AdaCore.
>
> [1] http://docs.adacore.com/xmlada-docs/schema.html
>
I get the same result when using your example. But when I try to fetch
elements from the DOM tree (Source is below), I get exceptions. For this
demo I've dumped the files into strings so the barrier to testing is
lower. Looking at XML documentation, local name doesn't include a prefix
and the namespace URI is obvious.
I compile with:
% gnatmake -gnatf -v -s -g -p -P schemaexample -bargs -E
When I run it I receive this:
% ./schemaexample
Execution terminated by unhandled exception
Exception name: CONSTRAINT_ERROR
Message: schemaexample.adb:59 discriminant check failed
Call stack traceback locations:
0x403b9f 0x4035f7 0x7fd1773c8eab 0x402b5b
% addr2line --demangle=gnat --functions --exe=schemaexample 0x403b9f
0x4035f7 0x7fb3dfc66eab 0x402b5b
schemaexample
/home/jkimball/websockets/schemaexample.adb:59
main
/home/jkimball/websockets/b~schemaexample.adb:508
??
??:0
<_start>
??:0
I'm working on a debug version of XML/Ada so the second half of these
addresses mean something to addr2line.
with Sax.Readers; use Sax.Readers;
with Schema.Readers; use Schema.Readers;
with Schema.Schema_Readers; use Schema.Schema_Readers;
with Schema.Validators; use Schema.Validators;
with Input_Sources.Strings; use Input_Sources.Strings;
with DOM.Core; use DOM.Core;
with DOM.Core.Elements;
with DOM.Core.Nodes;
with Ada.Text_IO; use Ada.Text_IO;
with Schema.DOM_Readers; use Schema.DOM_Readers;
with Unicode.CES.Utf8;
procedure SchemaExample is
XSD : constant String := "<?xml version=""1.0"" encoding=""UTF-8""?>"
& "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema""
elementFormDefault=""qualified""
targetNamespace=""http://singo1.com/schemas/agent""
xmlns:agent=""http://singo1.com/schemas/agent"">"
& " <xs:element name=""response"" type=""agent:agent-message""/>"
& " <xs:complexType name=""agent-message"">"
& " <xs:sequence>"
& " <xs:element ref=""agent:message""/>"
& " </xs:sequence>"
& " </xs:complexType>"
& " <xs:element name=""message"" type=""xs:string""/>"
& "</xs:schema>";
XML : constant String := "<?xml version=""1.0""?>"
& "<agent:response xmlns:agent=""http://singo1.com/schemas/agent"">"
& " <agent:message>Zerg</agent:message>"
& "</agent:response>";
Grammar : XML_Grammar;
S_Reader : Schema_Reader;
Input : String_Input;
My_Reader : Schema.DOM_Readers.Tree_Reader;
Document : DOM.Core.Document;
Messages : DOM.Core.Node_List;
Length : Natural;
Agent_NS : constant String := "http://singo1.com/schemas/agent";
begin
Input_Sources.Strings.Open (Str => XSD, Encoding =>
Unicode.CES.Utf8.Utf8_Encoding, Input => Input);
Parse (S_Reader, Input);
Close (Input);
Grammar := Get_Grammar (S_Reader);
Set_Public_Id (Input, "Agent file");
Input_Sources.Strings.Open (Str => XML, Encoding =>
Unicode.CES.Utf8.Utf8_Encoding, Input => Input);
Set_Grammar (My_Reader, Grammar);
Set_Feature (My_Reader, Schema_Validation_Feature, True);
Parse (My_Reader, Input);
Close (Input);
Document := Schema.DOM_Readers.Get_Tree (My_Reader);
Messages := DOM.Core.Elements.Get_Elements_By_Tag_Name_NS (Elem =>
Document, Namespace_URI => Agent_NS, Local_Name => "message");
Length := DOM.Core.Nodes.Length (Messages);
Schema.DOM_Readers.Free (My_Reader);
DOM.Core.Free (Messages);
Put_Line ("OK.");
end SchemaExample;
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: XML/Ada schema validation and XML namespaces
2013-04-10 17:42 ` J Kimball
@ 2013-04-10 19:56 ` Simon Wright
0 siblings, 0 replies; 5+ messages in thread
From: Simon Wright @ 2013-04-10 19:56 UTC (permalink / raw)
J Kimball <nntp@kmbll.com> writes:
> Document := Schema.DOM_Readers.Get_Tree (My_Reader);
>
> Messages := DOM.Core.Elements.Get_Elements_By_Tag_Name_NS
> (Elem => Document, Namespace_URI => Agent_NS, Local_Name => "message");
Well, in Dom.Core,
subtype Document is Node (Document_Node);
but Get_Elements_By_Tag_Name_NS'e Elem parameter is an Element
subtype Element is Node (Element_Node);
I think you need the first child of the document (I think there's only
one): Elem => DOM.Core.Nodes.First_Child (Document).
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-04-10 19:56 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-04-08 19:58 XML/Ada schema validation and XML namespaces J Kimball
2013-04-08 20:00 ` J Kimball
2013-04-09 11:45 ` Simon Wright
2013-04-10 17:42 ` J Kimball
2013-04-10 19:56 ` Simon Wright
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox