Recipe 14.1. Parsing a Simple XML Document
Problem
You have a collection of data stored in an XML document. You want to parse the document and turn
the data it contains into a collection of C++ objects. Your XML document is small enough to fit into
memory and doesn't use an internal Document Type Definition (DTD) or XML Namespaces.
Solution
Use the TinyXml library. First, define an object of type TiXmlDocument and call its LoadFile() method,
passing the pathname of your XML document as its argument. If LoadFile( ) returns true, your document
has been successfully parsed. If parsing was successful, call the RootElement() method to obtain a
pointer to an object of type TiXmlElement representing the document root. This object has a hierarchical
structure that reflects the structure of your XML document; by traversing this structure, you can extract
information about the document and use this information to create a collection of C++ objects.
For example, suppose you have an XML document animals.xml representing a collection of circus
animals, as shown in Example 14-1
. The document root is named animalList and has a number of child
animal elements each representing an animal owned by the Feldman Family Circus. Suppose you also
have a C++ class named Animal, and you want to construct a std::vector of Animals corresponding to
the animals listed in the document.
Example 14-1. An XML document representing a list of circus animals
<?xml version="1.0" encoding="UTF-8"?>
<!-- Feldman Family Circus Animals -->
<animalList>
<animal>
<name>Herby</name>
<species>elephant</species>
<dateOfBirth>1992-04-23</dateOfBirth>
<veterinarian name="Dr. Hal Brown" phone="(801)595-9627"/>
<trainer name="Bob Fisk" phone="(801)881-2260"/>
</animal>
<animal>
<name>Sheldon</name>
<species>parrot</species>
<dateOfBirth>1998-09-30</dateOfBirth>
<veterinarian name="Dr. Kevin Wilson" phone="(801)466-6498"/>
<trainer name="Eli Wendel" phone="(801)929-2506"/>
</animal>
<animal>
<name>Dippy</name>
<species>penguin</species>
<dateOfBirth>2001-06-08</dateOfBirth>
<veterinarian name="Dr. Barbara Swayne" phone="(801)459-7746"/>
<trainer name="Ben Waxman" phone="(801)882-3549"/>
</animal>
</animalList>
Example 14-2
shows how the definition of the class Animal might look. Animal has five data members
corresponding to an animal's name, species, date of birth, veterinarian, and trainer. An animal's name and
species are represented as std::strings, its date of birth is represented as a boost::gregorian::date from
Boost.Date_Time, and its veterinarian and trainer are represented as instances of the class Contact, also
defined in Example 14-2
Example 14-3
shows how to use TinyXml to parse the document animals.xml
, traverse the parsed document, and populate a std::vector of Animals using data extracted from the
Page 531
ABC Amber CHM Converter Trial version, http://www.processtext.com/abcchm.html
Pdf splitter - Split, seperate PDF into multiple files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Explain How to Split PDF Document in Visual C#.NET Application
reader split pdf; acrobat split pdf
Pdf splitter - VB.NET PDF File Split Library: Split, seperate PDF into multiple files in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET PDF Document Splitter Control to Disassemble PDF Document
split pdf into multiple files; cannot select text in pdf file
Page 532
ABC Amber CHM Converter Trial version, http://www.processtext.com/abcchm.html
C# PDF: C#.NET PDF Document Merging & Splitting Control SDK
C#.NET PDF Splitter to Split PDF File. In this section, we aims to tell you how to divide source PDF file into two smaller PDF documents at the page index you
break a pdf into multiple files; c# print pdf to specific printer
C# Word: .NET Merger & Splitter Control to Merge & Split MS Word
a larger Word file or how to divide source MS Word file into several smaller documents, RasterEdge designs this C#.NET MS Word merger & splitter control SDK.
break pdf file into parts; pdf specification
Page 533
ABC Amber CHM Converter Trial version, http://www.processtext.com/abcchm.html
VB.NET Word: Merge Multiple Word Files & Split Word Document
and editing controls, this VB.NET Word merger and splitter library SDK We are dedicated to provide powerful & profession imaging controls, PDF document, image
split pdf; break pdf documents
VB.NET TIFF: .NET TIFF Splitting Control to Split & Disassemble
splitting, please follow this link to C#.NET TIFF splitter control tutorial OpenDocumentFile(fileName, New TIFDecoder()) 'use TIFDecoder open a pdf file Dim
break a pdf apart; break pdf password
Recipe 14.2. Working with Xerces Strings
Problem
You want to be able to handle the wide-character strings used by the Xerces library safely and easily. In
particular, you want to be able to store strings returned by Xerces functions as well as to convert
between Xerces strings and C++ standard library strings.
Solution
You can store wide-character strings returned by Xerces library functions using the template
std::basic_string specialized for the Xerces wide-character type XMLCh:
typedef std::basic_string<XMLCh> XercesString;
To translate between Xerces strings and narrow-character strings, use the overloaded static method
TRanscode( ) from the class xercesc::XMLString, defined in the header xercesc/util/XMLString.hpp.
Example 14-4
defines two overloaded utility functions, toNative and fromNative, that use transcode to
translate from narrow-character strings to Xerces strings and vice versa. Each function has two variants,
one that takes a C-style string and one that takes a C++ standard library string. These utility functions are
all you'll need to convert between Xerces string and narrow-character strings; once you define them,
you'll never need to call transcode directly.
Example 14-4. The header xerces_strings.hpp, for converting between Xerces strings and
narrow-character strings
#ifndef XERCES_STRINGS_HPP_INCLUDED
#define XERCES_STRINGS_HPP_INCLUDED
#include <string>
#include <boost/scoped_array.hpp>
#include <xercesc/util/XMLString.hpp>
typedef std::basic_string<XMLCh> XercesString;
// Converts from a narrow-character string to a wide-character string.
inline XercesString fromNative(const char* str)
{
boost::scoped_array<XMLCh> ptr(xercesc::XMLString::transcode(str));
return XercesString(ptr.get( ));
}
// Converts from a narrow-character string to a wide-charactr string.
inline XercesString fromNative(const std::string& str)
{
return fromNative(str.c_str( ));
}
// Converts from a wide-character string to a narrow-character string.
inline std::string toNative(const XMLCh* str)
{
boost::scoped_array<char> ptr(xercesc::XMLString::transcode(str));
return std::string(ptr.get( ));
}
// Converts from a wide-character string to a narrow-character string.
inline std::string toNative(const XercesString& str)
{
return toNative(str.c_str( ));
}
#endif // #ifndef XERCES_STRINGS_HPP_INCLUDED
Page 534
ABC Amber CHM Converter Trial version, http://www.processtext.com/abcchm.html
Online Split PDF file. Best free online split PDF tool.
RasterEdge Visual C# .NET PDF document splitter control toolkit SDK can not only offer C# developers a professional .NET solution to split PDF document file
break apart a pdf in reader; break a pdf file into parts
VB.NET PowerPoint: Merge and Split PowerPoint Document(s) with PPT
Then, here comes the VB.NET PPT document splitter in handy. Note: If you want to see more PDF processing functions in VB.NET, please follow the link.
acrobat split pdf into multiple files; pdf splitter
Page 535
ABC Amber CHM Converter Trial version, http://www.processtext.com/abcchm.html
C# PDF: C# Code to Process PDF Document Page Using C#.NET PDF
C# PDF Page Processing: Split PDF Document - C#.NET PDF splitter control to divide one PDF file into two smaller PDF documents. Recommend this to Google+.
break up pdf into individual pages; pdf file specification
C# PowerPoint - Split PowerPoint Document in C#.NET
RasterEdge Visual C# .NET PowerPoint document splitter control toolkit SDK can not only offer C# developers a professional .NET solution to split PowerPoint
break pdf into single pages; break a pdf into smaller files
Page 536
ABC Amber CHM Converter Trial version, http://www.processtext.com/abcchm.html
Recipe 14.3. Parsing a Complex XML Document
Problem
You have a collection of data stored in an XML document that uses an internal DTD or XML
Namespaces. You want to parse the document and turn the data it contains into a collection of C++
objects.
Solution
Use Xerces's implementation of the SAX2 API (the Simple API for XML, Version 2.0). First, derive a
class from xercesc::ContentHandler; this class will receive notifications about the structure and content of
your XML document as it is being parsed. Next, if you like, derive a class from xercesc::ErrorHandler to
receive warnings and error notifications. Construct a parser of type xercesc::SAX2XMLReader, register
instances of your handler classes using the parser's setContentHandler( ) and setErrorHandler() methods.
Finally, invoke the parser's parse( ) method, passing the file pathname of your document as its argument.
For example, suppose you want to parse the XML document animals.xml from Example 14-1
and
construct a std::vector of Animals representing the animals listed in the document. (See Example 14-2
for
the definition of the class Animal.) In Example 14-3
, I showed how to do this using TinyXml. To make
the problem more challenging, let's add namespaces to the document, as shown in Example 14-5
.
Example 14-5. List of circus animals, using XML Namespaces
<?xml version="1.0" encoding="UTF-8"?>
<!-- Feldman Family Circus Animals with Namespaces -->
<ffc:animalList xmlns:ffc="http://www.feldman-family-circus.com">
<ffc:animal>
<ffc:name>Herby</ffc:name>
<ffc:species>elephant</ffc:species>
<ffc:dateOfBirth>1992-04-23</ffc:dateOfBirth>
<ffc:veterinarian name="Dr. Hal Brown" phone="(801)595-9627"/>
<ffc:trainer name="Bob Fisk" phone="(801)881-2260"/>
</ffc:animal>
<!-- etc. -->
</ffc:animalList>
To parse this document with SAX2, define a ContentHandler, as shown in Example 14-6
, and an
ErrorHandler, as shown in Example 14-7
. Then construct a SAX2XMLReader, register your handlers,
and run the parser. This is illustrated in Example 14-8
.
Example 14-6. A SAX2 ContentHandler for parsing the document animals.xml
#include <stdexcept>                       // runtime_error
#include <vector>
#include <xercesc/sax2/Attributes.hpp>
#include <xercesc/sax2/DefaultHandler.hpp> // Contains no-op 
// implementations of
// the various handlers
#include "xerces_strings.hpp"              // Example 14-4
#include "animal.hpp"
using namespace std;
using namespace xercesc;
// Returns an instance of Contact based 
// on the given collection of attributes
Page 537
ABC Amber CHM Converter Trial version, http://www.processtext.com/abcchm.html
Page 538
ABC Amber CHM Converter Trial version, http://www.processtext.com/abcchm.html
Page 539
ABC Amber CHM Converter Trial version, http://www.processtext.com/abcchm.html
Recipe 14.4. Manipulating an XML Document
Problem
You want to represent an XML document as a C++ object so that you can manipulate its elements,
attributes, text, DTD, processing instructions, and comments.
Solution
Use Xerces's implementation of the W3C DOM. First, use the class
xercesc::DOMImplementationRegistry to obtain an instance of xercesc::DOMImplementation, then use
the DOMImplementation to create an instance of the parser xercesc::DOMBuilder. Next, register an
instance of xercesc::DOMErrorHandler to receive notifications of parsing errors, and invoke the parser's
parseURI( ) method with your XML document's URI or file pathname as its argument. If the parse is
successful, parseURI will return a pointer to a DOMDocument representing the XML document. You
can then use the functions defined by the W3C DOM specification to inspect and manipulate the
document.
When you are done manipulating the document, you can save it to a file by obtaining a DOMWriter from
the DOMImplementation and calling its writeNode( ) method with a pointer to the DOMDocument as its
argument.
Example 14-10
shows how to use DOM to parse the document animals.xml from Example 14-1
,
locate and remove the node corresponding to Herby the elephant, and save the modified document.
Example 14-10. Using DOM to load, modify, and then save an XML document
#include <exception>
#include <iostream>     // cout
#include <xercesc/dom/DOM.hpp>
#include <xercesc/framework/LocalFileFormatTarget.hpp>
#include <xercesc/sax/SAXException.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include "animal.hpp"
#include "xerces_strings.hpp"
using namespace std;
using namespace xercesc;
/*
* Define XercesInitializer as in Example 14-8
*/
// RAII utility that releases a resource when it goes out of scope.
template<typename T>
class DOMPtr {
public:
DOMPtr(T* t) : t_(t) { }
~DOMPtr( ) { t_->release( ); }
T* operator->( ) const { return t_; }
private:
// prohibit copying and assigning
DOMPtr(const DOMPtr&);
DOMPtr& operator=(const DOMPtr&);
T* t_;
};
// Reports errors encountered while parsing using a DOMBuilder.
class CircusErrorHandler : public DOMErrorHandler {
public:
Page 540
ABC Amber CHM Converter Trial version, http://www.processtext.com/abcchm.html
Documents you may be interested
Documents you may be interested