diff --git a/api/XMLDataFormatter.php b/api/XMLDataFormatter.php
index f8fdf6c30..63d882211 100644
--- a/api/XMLDataFormatter.php
+++ b/api/XMLDataFormatter.php
@@ -39,8 +39,7 @@ class XMLDataFormatter extends DataFormatter {
return "\n" . $this->convertDataObjectWithoutHeader($obj, $fields);
}
-
-
+
public function convertDataObjectWithoutHeader(DataObject $obj, $fields = null, $relations = null) {
$className = $obj->class;
$id = $obj->ID;
@@ -57,7 +56,13 @@ class XMLDataFormatter extends DataFormatter {
if(is_object($fieldValue) && is_subclass_of($fieldValue, 'Object') && $fieldValue->hasMethod('toXML')) {
$xml .= $fieldValue->toXML();
} else {
- $xml .= "<$fieldName>" . Convert::raw2xml($fieldValue) . "$fieldName>\n";
+ if('HTMLText' == $fieldType) {
+ // Escape HTML values using CDATA
+ $fieldValue = sprintf('', str_replace(']]>', ']]]]>', $fieldValue));
+ } else {
+ $fieldValue = Convert::raw2xml($fieldValue);
+ }
+ $xml .= "<$fieldName>$fieldValue$fieldName>\n";
}
}
diff --git a/tests/api/XMLDataFormatterTest.php b/tests/api/XMLDataFormatterTest.php
new file mode 100644
index 000000000..a62ef8bc9
--- /dev/null
+++ b/tests/api/XMLDataFormatterTest.php
@@ -0,0 +1,40 @@
+objFromFixture('XMLDataFormatterTest_DataObject', 'test-do');
+ $xml = new SimpleXMLElement('' . $formatter->convertDataObjectWithoutHeader($obj));
+ $this->assertEquals(
+ Director::absoluteBaseURL() . sprintf('api/v1/XMLDataFormatterTest_DataObject/%d.xml', $obj->ID),
+ (string) $xml['href']
+ );
+ $this->assertEquals('Test DataObject', (string) $xml->Name);
+ $this->assertEquals('Test Company', (string) $xml->Company);
+ $this->assertEquals($obj->ID, (int) $xml->ID);
+ $this->assertEquals(
+ 'mysite.com is a link in this HTML content. ]]>',
+ $xml->Content->asXML()
+ );
+ $this->assertEquals(
+ 'mysite.com is a link in this HTML content. ',
+ (string) $xml->Content
+ );
+ }
+
+}
+class XMLDataFormatterTest_DataObject extends DataObject implements TestOnly {
+
+ public static $db = array(
+ 'Name' => 'Varchar(50)',
+ 'Company' => 'Varchar(50)',
+ 'Content' => 'HTMLText'
+ );
+
+}
\ No newline at end of file
diff --git a/tests/api/XMLDataFormatterTest.yml b/tests/api/XMLDataFormatterTest.yml
new file mode 100644
index 000000000..951dc8d2d
--- /dev/null
+++ b/tests/api/XMLDataFormatterTest.yml
@@ -0,0 +1,5 @@
+XMLDataFormatterTest_DataObject:
+ test-do:
+ Name: Test DataObject
+ Company: Test Company
+ Content: mysite.com is a link in this HTML content.
\ No newline at end of file