Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
A python library and command-line tool to "prettify" and colorize XML.
Python
tag: v0.2.10

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
pxml
.gitignore
CHANGELOG.rst
LICENSE.txt
MANIFEST.in
Makefile
Makefile.python
README.rst
TODO.txt
VERSION.txt
pxml-color.png
setup.cfg
setup.py

README.rst

Pretty-Print XML

A python library and command-line tool to "prettify" and colorize XML. It also provides a unittest.TestCase mixin that adds the assertXmlEqual method and, on difference, shows a "pretty" diff.

Installation

$ pip install pxml

On the Command-Line

$ echo '<root><node attr="value">foo</node></root>' | pxml
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <node attr="value">foo</node>
</root>

And add some color:

pxml with color

As a Python Module

import pxml, six

src = six.StringIO('<root><node attr="value">foo</node></root>')
out = six.StringIO()

pxml.prettify(src, out)

assert(out.getvalue() == '''\
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <node attr="value">foo</node>
</root>
''')

Unit Testing

The pxml.XmlTestMixin class adds the assertXmlEqual method to the subclass which allows easy semantic comparison that two XML structures are equivalent. It does so by ignoring ignorable whitespace, attribute order, quote types, and other differences that are byte-level differences when serialized, but don't actually represent semantic differences. When differences are detected, displays the XML differences in "prettified" XML for easier comparison.

import unittest, pxml

class MyTestCase(unittest.TestCase, pxml.XmlTestMixin):

  def test_equivalent_xml(self):
    src = '<root  ><node a="1" b="0"/></root>'
    chk = '<root><node   b="0" a="1"  /></root  >'
    self.assertXmlEqual(src, chk)

  def test_different_xml(self):
    src = '<root  ><node a="1" b="0"/></root>'
    chk = '<root><node   b="1" a="0"  /></root  >'
    self.assertXmlEqual(src, chk)

    # this fails the test and produces the following error message:
    #   AssertionError: [truncated]... != [truncated]...
    #     <?xml version="1.0" encoding="UTF-8"?>
    #     <root>
    #   -   <node a="1" b="0"/>
    #   +   <node a="0" b="1"/>
    #     </root>
Something went wrong with that request. Please try again.