Use libxml2 under linux to validate xpath against schema

Posted on 2008-10-16
Medium Priority
Last Modified: 2010-04-21

I have a question regarding programming libxml2 in C under linux.

Assume an XSD file called test.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="test" type="Test-Type"/>
    <xs:complexType name="Test-Type">
            <xs:element name="test-type-1"  type="xs:string"/>
            <xs:element name="test-type-2"  type="xs:integer"/>

And an XML file called test.xml:


We can verify that this schema validates like this:
$ xmllint --noout --schema test.xsd test.xml
test.xml validates

It is trivial to write a program to validate an entire XML file against a schema.  For instance, if I can use this snippet:

  ctxt = xmlSchemaNewParserCtxt("test.xsd");

To verify the XSD file and then:
  doc = xmlReadMemory (xml_buf, strlen(xml_buf), NULL, NULL, 0);
  schemaErrors = xmlSchemaValidateDoc(ctxt, doc);
to validate the xml file against the XSD schema.  

So my question:  what if I want to validate not an ENTIRE xml document but only PART of one?  
I'd like to only check an xpath -- not an entire XML document -- for validation.  For instance, have a buffer containing:


and validate that against the test.xsd file.  So if the buffer contained

receive the libxml2 error message:

"Schemas validity error : Element 'test-type-2': 'foo' is not a valid value of the atomic type 'xs:integer'.
test.xml fails to validate"

I think the libxml2 function xmlSchemaValidateOneElement() is what I need to use, but I can't get it work.

Any thoughts or ideas?


Question by:pennypiper
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
LVL 53

Expert Comment

ID: 22739228
If I recall correctly, xmlSchemaValidateOneElement starts validating the subtree starting from the given node. However, that given node has to be a valid root node for the schema. In your case, it has to be a 'test' node.

I'm not aware of a way to do what you want in libxml2 though ...
LVL 60

Accepted Solution

Geert Bormans earned 2000 total points
ID: 22746373
I am not sure if this is what Infinity08 is saying, but...

For what I know xmlSchemaValidateOneElement() is what you should use.
With xmlSchemaValidateOneElement one has the freedom to choose the
validation root node. But bear in mind that all other constraining aspects of XML Schema
validation apply: i.e. the validation root must have a global element declaration.

A globally defined element is one that is defined as a direct child of the xs:schema element
and referenced inside a complexType (sequence, choice or whatever) with an ref attribute

<xs:element name="order">
            <xs:element ref="TimeDate"/>
            <xs:element name="ProMember"/>

<xs:element name="TimeDate"/>

In this example, <TimeDate> and <order> are global elements (and can serve as a root node for validation purposes)
<ProMember> is a locally defined element and can only live inside the context of an order. So you can't validate just <ProMember>
with xmlSchemaValidateOneElement(), you would need to validate at least up to the level of <order>

If you want to validate <ProMember> elements, you will need to change the schema and move the <ProMember> definition outside the <order> content type.

If I now look back at your example, I see that <test-type-1> and <test-type-2>
are localy declared... meaning they can't be used as a valid root node.
So you definitely have to start by changing that.

I hope this makes sense


Author Closing Comment

ID: 31506930
Thanks Geert.
LVL 60

Expert Comment

by:Geert Bormans
ID: 22761874

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
The goal of this video is to provide viewers with basic examples to understand and use structures in the C programming language.
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question