lubi
lubi

Reputation: 147

dart xml with external files

I've been able to follow all the examples of dart-xml but that is only for a dart file containing xml in a variable. How to i parse and create external xml files?

If I try and import an xml file directly dart usually gets stuck on the first character of the xml file '<'.

How would I write the given example from dart-xml https://github.com/renggli/dart-xml? I can print it to the shell using

print(bookshelfXml.toString());

but how to i save || pipe it to an external file? I've tried to use dart:io a little but not having any success at the moment.

Upvotes: 2

Views: 1376

Answers (2)

lubi
lubi

Reputation: 147

Thanks renggli @ github, zoeichi for dart:io assistance.

To do the examples from the dart-xml repo with external files try;

import 'dart:io';
import 'package:xml/xml.dart' as xml;

void main (){

//create file bookshelf.xml seperately using example on github.
// <?xml version="1.0"?>
//     <bookshelf>
//       <book>
//         <title lang="english">Growing a Language</title>
//         <price>29.99</price>
//       </book>
//       <book>
//         <title lang="english">Learning XML</title>
//         <price>39.95</price>
//       </book>
//       <price>132.00</price>
//     </bookshelf>

//parse external file
var book = xml.parse(new File('bookshelf.xml').readAsStringSync());
print(book.toString());
print('---');

//finding elements
var titles = book.findAllElements('title');
titles
    .map((node) => node.text)
    .forEach(print);

//finding elements, convert strings to compute sum
var total =  book.findAllElements('book')
    .map((node) => double.parse(node.findElements('price').single.text))
    .reduce((a, b) => a + b);
print(total);   
print('---');

//build external file using example
var builder = new xml.XmlBuilder();
builder.processing('xml', 'version="1.0"');
builder.element('bookshelf', nest: () {
  builder.element('book', nest: () {
    builder.element('title', nest: () {
      builder.attribute('lang', 'english');
      builder.text('Growing a Language');
    });
    builder.element('price', nest: 29.99);
  });
  builder.element('book', nest: () {
    builder.element('title', nest: () {
      builder.attribute('lang', 'english');
      builder.text('Learning XML');
    });
    builder.element('price', nest: 39.95);
  });
  builder.element('price', nest: 132.00);
});
var bookshelfXml = builder.build();

//create and write eternal file name and contents 
var buildXml = new File('bookshelfDartCreated.xml');
buildXml.writeAsString(bookshelfXml.toString());

//check newly created file
new File('bookshelfDartCreated.xml').readAsString().then((String contents) {
  print(contents);
  });
}

Upvotes: 2

G&#252;nter Z&#246;chbauer
G&#252;nter Z&#246;chbauer

Reputation: 657676

This should do what you want:

import 'dart:io';

...

var file = new File('path/to/file.xml');
file.writeAsString(bookshelfXml.toString());

See also:

Upvotes: 1

Related Questions