On 02/06/2011 03:43 PM, Tomek Sowiński wrote:
While I'm circling the problem of parsing, I took a quick look at writing not 
to get stuck in analysis-paralysis. Writing XML is pretty independent from 
parsing and an order of magnitude easier to solve. It was perfect to get myself 
coding.

These are the guidelines I followed:

  * Memory minimalism: don't force allocating an intermediate node structure 
just to push a few tags down the wire.

  * Composability: operating on an arbitrary string output range.

  * Robustness: tags should not be left open, even if the routine producing tag 
interior throws.

  * Simplicity of syntax: resembling real XML if possible.

  * Space efficiency / readability: can write tightly (without indents and 
newlines) for faster network transfer and, having easy an means for temporary 
tight writing, for better readability.

  * Ease of use:
    - automatic to!string of non-string values,
    - automatic string escaping according to XML standard,
    - handle nulls: close the tags short (<tag/>), don't write attributes with 
null values at all.

  * anything else?


The new writer meets pretty much all of the above. Here's an example to get a 
feel of it:

auto books = [
     Book([Name("Grębosz", "Jerzy")], "Pasja C++", 1999),
     Book([Name("Navin", "Robert", "N.")], "Mathemetics of Derivatives", 2007),
     Book([Name("Tokarczuk", "Olga")], "Podróż ludzi Księgi", 1996),
     Book([Name("Graham", "Ronald", "L."),
          Name("Knuth", "Donald", "E."),
          Name("Patashnik", "Oren")], "Matematyka Konkretna", 2008)
];

auto outputRange = ... ;
auto xml = xmlWriter(outputRange);

xml.comment(books.length, " favorite books of mine.");
foreach (book; books) {
     xml.book("year", book.year, {
          foreach (author; book.authors) {
              xml.tight.authorName({
                  xml.first(author.first);
                  xml.middle(author.middle);
                  xml.last(author.last);
              });
          }
          xml.tight.title(book.title);
     });
}

--------------------------------- program output 
---------------------------------

<!-- 4 favorite books of mine. -->
<book year="1999">
   <authorName><first>Jerzy</first><middle/><last>Grębosz</last></authorName>
   <title>Pasja C++</title>
</book>
<book year="2007">
   
<authorName><first>Robert</first><middle>N.</middle><last>Navin</last></authorName>
   <title>Mathemetics of Derivatives</title>
</book>
<book year="1996">
   <authorName><first>Olga</first><middle/><last>Tokarczuk</last></authorName>
   <title>Podróż ludzi Księgi</title>
</book>
<book year="2008">
   
<authorName><first>Ronald</first><middle>L.</middle><last>Graham</last></authorName>
   
<authorName><first>Donald</first><middle>E.</middle><last>Knuth</last></authorName>
   <authorName><first>Oren</first><middle/><last>Patashnik</last></authorName>
   <title>Matematyka Konkretna</title>
</book>


Questions and comments?

When does one need to write by hand, in source, structured data needing to be serialised into XML (or any other format)? In my (admittedly very limited), such data always are outputs of some processing (if only reading from other file).

denis
--
_________________
vita es estrany
spir.wikidot.com

Reply via email to