XML error at ampersand (&)
Solution 1
&
in XML starts an entity. As you haven't defined an entity &WhateverIsAfterThat
an error is thrown. You should escape it with &
.
$string = str_replace('&', '&', $string);
How do I escape ampersands in XML
To escape the other reserved characters:
function xmlEscape($string) {
return str_replace(array('&', '<', '>', '\'', '"'), array('&', '<', '>', ''', '"'), $string);
}
Solution 2
$string =
htmlspecialchars
($string,
ENT_XML1
);
is the most universal way to solve all encoding errors (IMHO better that write custom functions + there is no point to solve just &
).
Credit: Put Wrikken's and joshweir's comment as answer to be more visible.
Solution 3
You need to either turn &
into its entity &
, or wrap the contents in CDATA tags.
If you choose the entity route, there are additional characters you need to turn into entities:
> >
< <
' '
" "
Background: Beware of the ampersand when using XML
Wikipedia: List of XML character entity references
Admin
Updated on October 06, 2021Comments
-
Admin over 2 years
I have a php file which prints an xml based on a MySql db.
I get an error every time at exactly the point where there is an & sign.
Here is some php:
$query = mysql_query($sql); $_xmlrows = ''; while ($row = mysql_fetch_array($query)) { $_xmlrows .= xmlrowtemplate($row); } function xmlrowtemplate($dbrow){ return "<AD> <CATEGORY>".$dbrow['category']."</CATEGORY> </AD> }
The output is what I want, i.e. the file outputs the correct category, but still gives an error.
The error says: xmlParseEntityRef: no name
And then it points to the exact character which is a & sign.
This complains only if the
$dbrow['category']
is something with an & sign in it, for example: "cars & trucks", or "computers & telephones".Anybody know what the problem is?
BTW: I have the encoding set to UTF-8 in all documents, as well as the xml output.