Ixmlwriter

Implementing IXmlWriter Part 14: Supporting Writing To A Stream
Implementing IXmlWriter c++ ixmlwriter xml
Published: 2006-01-10
Implementing IXmlWriter Part 14: Supporting Writing To A Stream

This is part 14/14 of my Implementing IXmlWriter post series.

Today I will add support for writing the generated XML to a C++ stream to last time’s IXmlWriter.

Finally the reason why I’ve insisted on calling this series IXmlWriter (instead of StringXmlWriter) should become clear: I’ve been planning on supporting writing the generated XML to more than just a string. Specifically, today I will add the ability to write the XML to a C++ ostream object, a base class in the C++ iostream library which defines a writable stream.

Read more...
Implementing IXmlWriter Part 13: Putting IXmlWriter Behind A Pimpl Firewall
Implementing IXmlWriter c++ ixmlwriter pimpl xml
Published: 2005-12-15
Implementing IXmlWriter Part 13: Putting IXmlWriter Behind A Pimpl Firewall

This is part 13/14 of my Implementing IXmlWriter post series.

As the private members of IXmlWriter are getting too numerous and too likely to change by my judgment, today I will put last time’s IXmlWriter behind a compilation firewall (pimpl).

The idea behind the pimpl idiom is to hide as much of the class definition as possible in order to avoid requiring users of the class to recompile if the class’s private members are changed. It is accomplished by moving all private members (functions, data, etc.) into a separate class (called the implementation or pimpl class) hidden from the class definition, and replacing these members with an opaque pointer to a forward declaration of this class. It works because a C++ compiler does not need to have the full definition of a class visible in order to allocate space for a pointer to the class; every pointer is a constant, fixed size (often 4 bytes).

Read more...
Implementing IXmlWriter Part 12: Supporting Pretty-Printing
Implementing IXmlWriter c++ ixmlwriter xml
Published: 2005-12-13
Implementing IXmlWriter Part 12: Supporting Pretty-Printing

This is part 12/14 of my Implementing IXmlWriter post series.

Today I will add support for pretty-printing to last time’s IXmlWriter.

Pretty-printing is the addition of whitespace at predetermined locations to make the resulting XML easier to read than when it is all on one line. In the .NET Framework’s System.Xml.XmlTextWriter class, it is supported by the properties Formatting, which allows you to enable or disable pretty-printing; Indentation, which allows you to specify how many whitespace characters indentation should use; and IndentChar, which allows you to specify the whitespace character to use for indentation. For IXmlWriter, I instead chose to expose these features exclusively through the constructor. This frees me from the worry of a user trying to change these properties after IXmlWriter has already begun writing XML, which could produce awkward results. Default parameters are used to make the use of pretty-printing optional and straightforward.

Read more...
Implementing IXmlWriter Part 11: Supporting Namespaces
Implementing IXmlWriter c++ ixmlwriter xml
Published: 2005-12-07
Implementing IXmlWriter Part 11: Supporting Namespaces

This is part 11/14 of my Implementing IXmlWriter post series.

Today I will add support for namespaces to last time’s IXmlWriter.

Namespaces are defined by the W3C recommendation Namespaces in XML. Using namespaces requires two parts: a namespace declaration, which associates a prefix with a namespace name (a user-defined, ideally globally-unique string which defines the namespace, often in the form of a URL); and the assignment of XML elements and attributes to this namespace by using the aforementioned prefix.

Read more...
Implementing IXmlWriter Part 10: Supporting WriteComment()
Implementing IXmlWriter c++ ixmlwriter xml
Published: 2005-12-02
Implementing IXmlWriter Part 10: Supporting WriteComment()

This is part 10/14 of my Implementing IXmlWriter post series.

Today I will add support for the function WriteComment() to last time’s IXmlWriter.

Quoting from Section 2.5: Comments of the XML 1.0 spec:

Comments MAY appear anywhere in a document outside other markup; in addition, they MAY appear within the document type declaration at places allowed by the grammar.

Considering this, we should allow writing comments in virtually every WriteState that the IXmlWriter can be in. In fact, some quick thought confirms that we should allow it for every WriteState but WriteState_Attribute, as a comment cannot be legally represented between the quotation marks which delimit an attribute value. With this in mind, here’s the test case I wrote:

Read more...
Implementing IXmlWriter Part 9: Supporting WriteStartDocument() and WriteEndDocument()
Implementing IXmlWriter c++ ixmlwriter xml
Published: 2005-11-22
Implementing IXmlWriter Part 9: Supporting WriteStartDocument() and WriteEndDocument()

This is part 9/14 of my Implementing IXmlWriter post series.

Today I will add support for the functions WriteStartDocument() and WriteEndDocument() to last time’s IXmlWriter.

WriteStartDocument() writes the XML declaration (i.e. <?xml version="1.0"?>) and WriteEndDocument() closes all open attributes and elements and sets the IXmlWriter back in the initial state. Adding support for these functions is straightforward. Note that I have introduced a new IXmlWriter state called WriteState_Prolog; this will be important later.

Read more...
Implementing IXmlWriter Part 8: Supporting WriteStartAttribute() and WriteEndAttribute()
Implementing IXmlWriter c++ ixmlwriter xml
Published: 2005-11-18
Implementing IXmlWriter Part 8: Supporting WriteStartAttribute() and WriteEndAttribute()

This is part 8/14 of my Implementing IXmlWriter post series.

Today I will add support for the functions WriteStartAttribute() and WriteEndAttribute() to last time’s IXmlWriter.

These functions are (obviously) used to denote the start and end of an attribute; the attribute value is written using WriteString() (this usage is analogous to WriteStartElement() and WriteEndElement()). Because WriteString() must now be aware of whether it is writing an attribute value or element content, I must keep track of the state the IXmlWriter is in — a change that affects nearly every function.

Read more...
Implementing IXmlWriter Part 7: Cleaning Up
Implementing IXmlWriter c++ ixmlwriter xml
Published: 2005-11-17
Implementing IXmlWriter Part 7: Cleaning Up

This is part 7/14 of my Implementing IXmlWriter post series.

Wow, I can’t believe that it’s been over a month already since my last IXmlWriter post. I guess my vacation ruined my exercise plan and my blogging habits. It’s well past time to get back into both.

Rather than introduce a new test case, I’m going to spend today “cleaning up” the previous version of IXmlWriter.

The first cleanup method is trivial but overdue — I will separate the implementation of IXmlWriter from its interface, as a user of IXmlWriter shouldn’t be particularly concerned about its implementation. In other words, I will separate it into a .h and a .cpp file. For now, IXmlWriter will continue to expose some implementation details (e.g. its private members), but these details should change relatively infrequently. If I ever need to completely separate its implementation from its interface, I will consider making it into a COM-like object or using the Pimpl idiom.

Read more...
Implementing IXmlWriter Part 6: Escaping Attribute Content
Implementing IXmlWriter c++ ixmlwriter xml
Published: 2005-10-12
Implementing IXmlWriter Part 6: Escaping Attribute Content

This is part 6/14 of my Implementing IXmlWriter post series.

Last time’s IXmlWriter has a serious bug: it doesn’t properly handle attribute value escaping and can lead to malformed XML.

Consider the following test case:

1
2
3
4
5
6
7
8
StringXmlWriter xmlWriter;
xmlWriter.WriteStartElement("root");
  xmlWriter.WriteStartElement("element");
    xmlWriter.WriteAttributeString("att", "\"");
  xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();

std::string strXML = xmlWriter.GetXmlString();

The previous version of IXmlWriter will generate the XML string <root><element att="""/></root>, which is invalid and will be rejected by a XML parser. The rules for XML attribute escaping are given by Section 2.3 of the XML 1.0 spec—specifically, the AttValue literal:

Read more...
Implementing IXmlWriter Part 5: Supporting WriteAttributeString()
Implementing IXmlWriter c++ ixmlwriter xml
Published: 2005-10-11
Implementing IXmlWriter Part 5: Supporting WriteAttributeString()

This is part 5/14 of my Implementing IXmlWriter post series.

Today I will add support for writing attributes to yesterday’s version of IXmlWriter.

To learn more about attributes, see the W3C XML 1.0 Recommendation. Writing attributes will be supported with the function WriteAttributeString().

Here’s today’s test case:

1
2
3
4
5
6
7
8
9
StringXmlWriter xmlWriter;
xmlWriter.WriteStartElement("root");
  xmlWriter.WriteStartElement("element");
    xmlWriter.WriteAttributeString("att", "value");
  xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();

std::string strXML = xmlWriter.GetXmlString();
// strXML should be <root><element att="value"/></root>

Because the changes in Implementing IXmlWriter Part 4 keep start elements unclosed until another function is called which requires them to be closed (e.g. WriteString() and WriteEndElement()), adding support for writing attributes is very simple. Here’s the version I came up with to pass all test cases:

Read more...