Chars in XML
ik ben bezig met het opbouwen van een XML. Gaat prima, maar degene die dit gaat verwerken, Google, gaat er niet mee akkoord. Blijft hangen op bepaalde karakters.
Karakters als bijvoorbeeld ® en ™ willen ze niet hebben.
Nu heb ik geprobeerd met de volgende functies ertussen:
htmlentities($string, ENT_QUOTES, "UTF-8");
utf8_encode($sting);
iconv("UTF-8","UTF-8//IGNORE",$string);
Maar tevergeefs nog niet. Hoe strip ik alle "rare" karakters uit een string?
Onder andere , . / - ( ) mogen blijven.
Alvast bedankt!
Gewijzigd op 17/05/2011 12:28:31 door Roy -
En waarom vind Google die karakters niet leuk? waar is het precies voor?
Van hen krijg ik te horen:
Bepaalde tekens in uw items zijn mogelijk ongeldig. Controleer of de tekens in uw feed geldige tekens voor de geselecteerde codering zijn.
Dit krijg ik te horen bij ® en bij ® waaruit ik op maak dat ze helemaal geen "rare" chars willen hebben.
Hoe ziet je XML eruit?
Opgelost middels de waardes te strippen met het volgende:
preg_replace("/[^a-zA-Z0-9-\s]/", "",$stringvariabele);
® is bijvoorbeeld ö ofzo ( weet ik niet zeker )
XML breekt bij aantreffen van ® of ™ etc..
Nadeel van deze oplossing is dat je tekens dan gewoon verdwijnen uiteraard, maar in mijn geval waren dat dus 10 patient namen waarvan een ö ofzo mistte van de 6100 in totaal. Nog te overzien dus.
Gewijzigd op 17/05/2011 14:59:40 door Dave L
Inderdaad, met een ^ teken in een character class [] defineer je gewoon alle karakters die niet mogen voorkomen in je replace. Word er dus uitgesloopt. Maar ik ben toch eens benieuwd naar de XML.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
function convertxml($tekst){
$tekst = secure($tekst);
$tekst = str_replace("®", "", $tekst);
$tekst = str_replace("™", "", $tekst);
$tekst = str_replace("±", "", $tekst);
$tekst = str_replace("”", "", $tekst);
$tekst = str_replace("ï", "", $tekst);
$tekst = str_replace("•", "", $tekst);
$tekst = str_replace("º", "", $tekst);
$tekst = str_replace("Ω", "", $tekst);
$tekst = str_replace("²", "", $tekst);
$tekst = str_replace("é", "", $tekst);
$tekst = str_replace("´", "", $tekst);
$tekst = str_replace("ë", "", $tekst);
$tekst = str_replace("’", "", $tekst);
$tekst = str_replace("×", "", $tekst);
$tekst = str_replace("“", "", $tekst);
$tekst = str_replace("°", "", $tekst);
$tekst = str_replace("–", "", $tekst);
$tekst = str_replace("Ø", "", $tekst);
$tekst = str_replace("è", "", $tekst);
$tekst = str_replace("‘", "", $tekst);
$tekst = str_replace("″", "", $tekst);
$tekst = str_replace("ü", "", $tekst);
return $tekst;
}
?>
function convertxml($tekst){
$tekst = secure($tekst);
$tekst = str_replace("®", "", $tekst);
$tekst = str_replace("™", "", $tekst);
$tekst = str_replace("±", "", $tekst);
$tekst = str_replace("”", "", $tekst);
$tekst = str_replace("ï", "", $tekst);
$tekst = str_replace("•", "", $tekst);
$tekst = str_replace("º", "", $tekst);
$tekst = str_replace("Ω", "", $tekst);
$tekst = str_replace("²", "", $tekst);
$tekst = str_replace("é", "", $tekst);
$tekst = str_replace("´", "", $tekst);
$tekst = str_replace("ë", "", $tekst);
$tekst = str_replace("’", "", $tekst);
$tekst = str_replace("×", "", $tekst);
$tekst = str_replace("“", "", $tekst);
$tekst = str_replace("°", "", $tekst);
$tekst = str_replace("–", "", $tekst);
$tekst = str_replace("Ø", "", $tekst);
$tekst = str_replace("è", "", $tekst);
$tekst = str_replace("‘", "", $tekst);
$tekst = str_replace("″", "", $tekst);
$tekst = str_replace("ü", "", $tekst);
return $tekst;
}
?>
Zodra er weer een xml fout is wordt deze naar me toe gemaild en kan ik deze aan dit lijstje toevoegen.
Klein stukje uit de XML, paar linkjes weg gehaald:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">
<title>*** - Product export xml</title>
<link rel="self" href="http://www.***.nl/"/>
<updated>2011-05-17</updated>
<author>
<name>***</name>
</author>
<entry>
<title>Asus Booksize S1-AT5NM10E</title>
<g:brand>Asus</g:brand>
<g:condition>new</g:condition>
<summary>S1-AT5NM10E - Intel Atom D525 (1M Cache, 1.80 GHz), Intel NM10, 2 x DIMM DDR3 max. 4GB, 1 x PCI-e x 1, NVIDA ION II GT218, 2 x SATA II, Gigabit Ethernet, WLAN 802.11 b/g/n, IR, BT, Realtek ALC887 8 Ch., 65W</summary>
<id>1</id>
<g:image_link>http://***/img/norm/high/5846092-2450.jpg</g:image_link>
<link href="http://www.***.nl/new/index.php?p=product&id=1"/>
<g:mpn>90PBB1AD010011AGCEZ</g:mpn>
<g:availability>out of stock</g:availability>
<g:online_only>n</g:online_only>
<g:price>212.80</g:price>
<g:product_type>Elektronica > Computers</g:product_type>
<g:quantity>0</g:quantity>
<g:shipping>
<g:country>NL</g:country>
<g:service>TNT Post</g:service>
<g:price>7.50</g:price>
</g:shipping>
<g:shipping>
<g:country>NL</g:country>
<g:service>TNT Rembours</g:service>
<g:price>17.00</g:price>
</g:shipping>
</entry>
</feed>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">
<title>*** - Product export xml</title>
<link rel="self" href="http://www.***.nl/"/>
<updated>2011-05-17</updated>
<author>
<name>***</name>
</author>
<entry>
<title>Asus Booksize S1-AT5NM10E</title>
<g:brand>Asus</g:brand>
<g:condition>new</g:condition>
<summary>S1-AT5NM10E - Intel Atom D525 (1M Cache, 1.80 GHz), Intel NM10, 2 x DIMM DDR3 max. 4GB, 1 x PCI-e x 1, NVIDA ION II GT218, 2 x SATA II, Gigabit Ethernet, WLAN 802.11 b/g/n, IR, BT, Realtek ALC887 8 Ch., 65W</summary>
<id>1</id>
<g:image_link>http://***/img/norm/high/5846092-2450.jpg</g:image_link>
<link href="http://www.***.nl/new/index.php?p=product&id=1"/>
<g:mpn>90PBB1AD010011AGCEZ</g:mpn>
<g:availability>out of stock</g:availability>
<g:online_only>n</g:online_only>
<g:price>212.80</g:price>
<g:product_type>Elektronica > Computers</g:product_type>
<g:quantity>0</g:quantity>
<g:shipping>
<g:country>NL</g:country>
<g:service>TNT Post</g:service>
<g:price>7.50</g:price>
</g:shipping>
<g:shipping>
<g:country>NL</g:country>
<g:service>TNT Rembours</g:service>
<g:price>17.00</g:price>
</g:shipping>
</entry>
</feed>
En zo zijn er zo'n 5000 producten.
Bedankt voor de reactie's!
En als je de node met speciale karakters in een CDATA element zet? Misschien dat speciale karakters dan wel werken :)
Kees Schepers op 17/05/2011 16:46:12:
En als je de node met speciale karakters in een CDATA element zet? Misschien dat speciale karakters dan wel werken :)
Bij mij stond alles ook in CDATA, helaas brak de xml dus hier ook op 'excentrieke' karakters...
Wat voor melding krijg je van Google bij die foute tekens?
Van Google krijg ik (zoals eerder aangegeven):
Bepaalde tekens in uw items zijn mogelijk ongeldig. Controleer of de tekens in uw feed geldige tekens voor de geselecteerde codering zijn.
Hierbij wordt aangegeven dat hij bijv. geen ® of ® wil hebben.
Op dit moment ben ik een functie aan het schrijven die de karakters tevens netjes vervangt.
Björn -> Bjorn
Karel & zonen -> Karel en zonen
Wel redelijk heftig in een while loop met veel database rijen, maar och...!
Gewijzigd op 19/05/2011 12:27:54 door Dave L
PHP DOM escaped als het goed is alles zelf. Lukt het daar niet gewoon mee? (Wel in een CDATA veld stoppen)
UTF-8 codering...
Wat problemen gaf:
print("<cell><![CDATA[".$row['PatNaam'])."]]></cell>");
Tijdelijke oplossing:
print("<cell><![CDATA[".preg_replace("/[^a-zA-Z0-9-\s]/", "",$row['PatNaam'])."]]></cell>");
Gewijzigd op 19/05/2011 17:39:26 door Dave L