On Thursday, 9 September 2021 at 17:17:23 UTC, tastyminerals
wrote:
Maybe I missed something obvious in the docs but how can I just
parse the XML and print its content?
```
import dxml.parser;
auto xml = parseXML!simpleXML(layout);
xml.map!(e => e.text).join.writeln;
```
throws
`core.exception.AssertError@../../../.dub/packages/dxml-0.4.3/dxml/source/dxml/parser.d(1457): text cannot be called with elementStart`.
dxml.parser is a streaming XML parser. The documentation at
http://jmdavisprog.com/docs/dxml/0.4.0/dxml_parser.html has a
link to more information about this at the top, behind 'StAX'.
Thus, when you're mapping over `xml`, you're not getting `<a>some
text</a>` at a time, but `<a>`, `some text`, and `</a>`
separately, as they're parsed. The `<a>` there is an
`elementStart` which lacks a `text`, hence the error.
Here's a script:
```d
#! /usr/bin/env dub
/++ dub.sdl:
dependency "dxml" version="0.4.0"
stringImportPaths "."
+/
import dxml.parser;
import std;
enum text = import(__FILE__)
.splitLines
.find("__EOF__")
.drop(1)
.join("\n");
void main() {
foreach (entity; parseXML!simpleXML(text)) {
if (entity.type == EntityType.text)
writeln(entity.text.strip);
}
}
__EOF__
<!-- comment -->
<root>
<foo>some text<whatever/></foo>
<bar/>
<baz></baz>
more text
</root>
```
that runs with this output:
```
some text
more text
```