Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
?
Solved

Use libxml2 under linux to validate xpath against schema

Posted on 2008-10-16
4
Medium Priority
?
1,160 Views
Last Modified: 2010-04-21
Hello,

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:all>
            <xs:element name="test-type-1"  type="xs:string"/>
            <xs:element name="test-type-2"  type="xs:integer"/>
        </xs:all>
    </xs:complexType>
</xs:schema>

And an XML file called test.xml:

<test>
  <test-type-1>foo</test-type-1>
  <test-type-2>1</test-type-2>
</test>


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");
  schema=xmlSchemaParse(ctxt);

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:

"<test-type-2>10</test-type-2"

and validate that against the test.xsd file.  So if the buffer contained
"<test-type-2>foo</test-type-2>"

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?

Thanks!



0
Comment
Question by:pennypiper
  • 2
4 Comments
 
LVL 53

Expert Comment

by:Infinity08
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 ...
0
 
LVL 60

Accepted Solution

by:
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:complexType>
        <xs:sequence>
            <xs:element ref="TimeDate"/>
            <xs:element name="ProMember"/>
         </xs:sequence>
    </xs:complexType>
</xs:element>

<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

Geert
0
 

Author Closing Comment

by:pennypiper
ID: 31506930
Thanks Geert.
0
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 22761874
welcome
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

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

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…
Examines three attack vectors, specifically, the different types of malware used in malicious attacks, web application attacks, and finally, network based attacks.  Concludes by examining the means of securing and protecting critical systems and inf…
The goal of this video is to provide viewers with basic examples to understand opening and writing to files 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.
Suggested Courses

581 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