Boost logo

Boost :

From: Phil Endecott (spam_from_boost_dev_at_[hidden])
Date: 2007-07-11 14:23:25

David Abrahams wrote:
> on Fri Jul 06 2007, Stefan Seefeld <> wrote:
>> over the last couple of years we have discussed possible XML APIs
>> for inclusion into boost. As I already had an early prototype for
>> such an API, I kept evolving it, based on feedback from those
>> discussions.
>> A couple of weeks ago I actually checked it into the sandbox
>> ( Today,
>> I adjusted the source layout to conform to the sandbox layout
>> we agreed on, including a - based build-system.
>> I would appreciate if anybody interested into a future boost.xml
>> submission would have a look, provide feedback, or even get
>> involved into the (ongoing) development.
> Okay, this is going to sound very opinionated:
> I find XML horrible to read

Agreed; I think it's just sufficiently good that a better alternative
would fail.

> however I find most of the procedural code I've seen for manipulating it even more horrible.

You've seen my code, haven't you :-)

> I would like to see a more declarative syntax for much of this stuff.

I prefer to read any constant fragments from files or from literal
strings, which is about as declarative as you can get.

> root.push_front(
> tag("articleinfo")[
> title ? (comment("This title was moved"), title) : NULL
> , tag("author")[
> tag("firstname")["Joe"],
> tag("surname")["Random"]
> ]
> ]
> )

How close can we get to that using Boost.Assign, if the element class
is a model of a suitable container?

But I think that using subclasses is the key to making this sort of
code easier on the eye:

struct firstname: public element {
   firstname(n): element("firstname",n) {};


articleinfo ai;
if (title) ai.push_back(comment("This title was moved"));
author a;

Just adding some non-standard indentation to that makes it almost as
clear as I need. You don't need the {}, but it keeps your editor's
auto-indent happy:

articleinfo ai;
   if (title) ai.push_back(comment("This title was moved"));
   author a;

You can also reduce the declare-populate-add to delcare-populate if you
pass the parent to the sub-elements' constructors:

articleinfo ai(root); {
   if (title) comment(ai,"This title was moved");
   author a(ai); {

Of course there is a question of the lifespan of these
apparently-temporary objects to resolve. Anyway, I think that
nice-looking XML-generating code can be possible without "resorting to"
operator overloading.



Boost list run by bdawes at, gregod at, cpdaniel at, john at