I have an XML and XSD file. I can read the XML using Xerces if XSD file has the root XML element define as a named complexType
but I am trying to figure out how to read the file if root item in XSD is not named type. Here are my files:
The XML file
<?xml version="1.0"?>
<x:books xmlns:x="urn:BookStore"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:BookStore books.xsd">
<book id="bk001">
<author>Writer</author>
<title>The First Book</title>
<genre>Fiction</genre>
<price>44.95</price>
<pub_date>2000-10-01</pub_date>
<review>An amazing story of nothing.</review>
</book>
<book id="bk002">
<author>Poet</author>
<title>The Poet's First Poem</title>
<genre>Poem</genre>
<price>24.95</price>
<pub_date>2001-10-01</pub_date>
<review>Least poetic poems.</review>
</book>
</x:books>
The XSD file:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:BookStore"
xmlns:bks="urn:BookStore">
<xsd:complexType name="BookForm">
<xsd:sequence>
<xsd:element name="author" type="xsd:string"/>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="genre" type="xsd:string"/>
<xsd:element name="price" type="xsd:float" />
<xsd:element name="pub_date" type="xsd:date" />
<xsd:element name="review" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
<xsd:element name="books"> <!-- not mapped to named typed! -->
<xsd:complexType >
<xsd:sequence>
<xsd:element name="book"
type="bks:BookForm"
minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Reading the library (reading only two fields)
#include <iostream>
#include "books.h"
using namespace std;
using namespace BookStore;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
try {
// what do I do here since BooksForm is not defined now and XSD file
// doesn't map it to the root element of XML?
auto_ptr<BooksForm> bookBank (books( "books.xml" ));
for (BooksForm::book_const_iterator i = (bookBank->book().begin());
i != bookBank->book().end();
++i)
{
cout << "Author is '" << i->author() << "'' " << endl;
cout << "Title is '" << i->title() << "'' " << endl;
cout << endl;
}
}
catch (const xml_schema::exception& e)
{
cerr << e << endl;
return 1;
}
return a.exec();
}
So this code works if XSD file is in format as in this post but I want to know how can I read the XML if the XSD file is in above format. I need to do this in this small demo so I can resolve the similar situation in another larger and more complex XML file which is a given thing.