Chars in XML
Beste forum leden,
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!
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 D
Gesponsorde koppelingen:
En waarom vind Google die karakters niet leuk? waar is het precies voor?
Google Merchant center, hiermee kunnen producten in Google shopping toegevoegd worden. Ben bezig met een webshop hiermee koppelen.
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.
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?
Ik had hetzelfde probleem bij het importeren van scv gegevens uit een heel oud dos programma en het hierna renderen van XML documenten via php.
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.
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.
Inmiddels alle fouten opgevangen en deze toegevoegd met als resultaat:
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:
En zo zijn er zo'n 5000 producten.
Bedankt voor de reactie's!
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...
Waarom zo vaak str_replace? Je kan dit makkelijk in 1 functie doen met arrays: http://snipplr.com/view/45786/strreplace-met-arrays/
Wat voor melding krijg je van Google bij die foute tekens?
Ook met cdata wil het niet. De oplossing met de str_replace gaat prima. Array hiervoor gebruiken is mogelijk, maar goed het werkt nu ook.
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.
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.
En zo is het maar net. Gewoon alle niet-xml-geldige karakters eruit slopen, OF vervangen.
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...!
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
Vreemd... Als je het in een CDATA node stopt en je XML UTF-8 gecodeerd is, zouden er geen problemen moeten voordoen.
PHP DOM escaped als het goed is alles zelf. Lukt het daar niet gewoon mee? (Wel in een CDATA veld stoppen)
PHP DOM escaped als het goed is alles zelf. Lukt het daar niet gewoon mee? (Wel in een CDATA veld stoppen)
Nope. Weet niet waarom, maar dit werkte bij mij niet :(
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>");
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



