diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py
index 2ccb77a593f..8cdd4ee3d3c 100644
--- a/Lib/test/test_xml_etree.py
+++ b/Lib/test/test_xml_etree.py
@@ -213,6 +213,23 @@ def check_encoding(ET, encoding):
"""
ET.XML("" % encoding)
+def processinginstruction():
+ """
+ Test ProcessingInstruction directly
+
+ >>> from xml.etree import ElementTree as ET
+
+ >>> ET.tostring(ET.ProcessingInstruction('test', 'instruction'))
+ ''
+ >>> ET.tostring(ET.PI('test', 'instruction'))
+ ''
+
+ Issue #2746
+
+ >>> ET.tostring(ET.PI('test', ''))
+ '?>'
+
+ """
#
# xinclude tests (samples from appendix C of the xinclude specification)
diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py
index 7dbc72e78f9..e5afcbca00a 100644
--- a/Lib/xml/etree/ElementTree.py
+++ b/Lib/xml/etree/ElementTree.py
@@ -666,9 +666,9 @@ def _write(self, file, node, encoding, namespaces):
# write XML to file
tag = node.tag
if tag is Comment:
- file.write("" % _escape_cdata(node.text, encoding))
+ file.write("" % _encode(node.text, encoding))
elif tag is ProcessingInstruction:
- file.write("%s?>" % _escape_cdata(node.text, encoding))
+ file.write("%s?>" % _encode(node.text, encoding))
else:
items = node.items()
xmlns_items = [] # new namespaces in this scope
diff --git a/Misc/ACKS b/Misc/ACKS
index 089e4634a73..0ce586eb4e9 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -525,6 +525,7 @@ Pablo Mouzo
Sjoerd Mullender
Sape Mullender
Michael Muller
+Neil Muller
R. David Murray
Piotr Meyer
John Nagle
diff --git a/Misc/NEWS b/Misc/NEWS
index 1a752fc7d8c..0300b4f5e4b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -78,6 +78,11 @@ Core and Builtins
Library
-------
+- Issue #2746: Don't escape ampersands and angle brackets ("&", "<", ">")
+ in XML processing instructions and comments. These raw characters are
+ allowed by the XML specification, and are necessary when outputting e.g.
+ PHP code in a processing instruction. Patch by Neil Muller.
+
- Issue #7869: logging: improved diagnostic for format-time errors.
- Issue #7868: logging: added loggerClass attribute to Manager.