xmltoolskit.org
XML utilities, in the browser
Say hi →

XML to HTML

updated 20 August 2026 · table or nested list · live preview

Render XML as HTML you can paste into a page: a table built from the document's repeating record element, or a nested list that mirrors the whole tree. Every value is escaped, and a live preview shows exactly what the markup produces.

xml → html
Drop a .xml file here, or
ready

XML to HTML

In table mode the tool finds the element that repeats most often — <item> in an RSS feed, <book> in a catalogue — and turns each occurrence into a row, with a column per child element and (optionally) per attribute. In list mode it walks the whole document and emits nested <ul>s instead, which suits documents that are not tabular at all.

How to use it

  1. Paste your XML, or drop a file on the left pane.
  2. Leave Record element on auto to use the most-repeated element, or type a name to pick one yourself.
  3. Switch to nested list for documents that are trees rather than tables.
  4. Read the preview below the panes, then copy the markup or download the file.

How the record element is chosen

Every parent/child element pair in the document is counted, and the pair with the most occurrences wins — so a feed with 40 <item> children of <channel> gives you a 40-row table. If nothing repeats at least twice, the root's children are used instead.

That heuristic is right most of the time and wrong occasionally, which is why the Record element box exists: type entry, product, or whatever your records are actually called and the guess is skipped.

Columns, including nested ones

A record's direct children become columns, in first-seen order across all records — so a field that only some records carry still gets a column, with empty cells elsewhere. One level of nesting is flattened into dotted column names: a <price><amount> pair becomes a price.amount column.

With include attributes on, attributes become their own columns prefixed with @, and an attribute on a child element appears as child@attr. Namespace declarations are skipped — they are not data.

Escaping

Every element name and value is HTML-escaped on the way out, so a document containing <script> in a text node produces visible text, not executable markup. The only thing you control directly is the CSS class name, which is escaped for attribute context.

FAQ

Why does my table have the wrong rows?

The auto-detected record element was not the one you meant — common in documents with deeply repeated wrappers. Type the element name into Record element and the table is rebuilt around it.

Can I get a full HTML page rather than a fragment?

The output is a fragment (a <table> or a <ul>) so it can be pasted into an existing page. Wrap it in your own document shell if you need a standalone file — that way it picks up your stylesheet rather than one invented here.

Does it style the table?

No CSS is generated. Put your own class in the CSS class box and style it in your stylesheet; the preview here shows the site's default table styling.

What happens to CDATA?

CDATA content is treated as text, which is what it is. If a cell holds HTML inside CDATA it will show as escaped text rather than markup — deliberately, since injecting it would be unsafe.

Is the document uploaded?

No. Parsing, conversion, and the preview all happen in your browser.

Related tools

Privacy

100% client-side. Conversion and preview both run in the page. See the privacy policy.