fix: String() handled ns prefixes incorrectly

Previously parsing a document like this:

```
<root xmlns:foo='http:/example.org/foo' foo:bar='1'/>
```

Would produce an incorrect document when turning it back into a string:

```
<root xmlns:foo='http:/example.org/foo' http:/example.org/foo:bar='1'/>
```

This patch fixes this by implementing a proper lookup for namespace
prefixes.