xml Parser liefert folgende Zeichen nicht: "&<

  • Antworten:4
Gelöschter Account
  • Forum-Beiträge: 7

20.06.2011, 22:37:05 via Website

Hallo alles zusammen! :)
Ich bin gerade an einer app, die automatisch nachrichten aus einer DB ließt, und diese automatisch versendet.
Im Prinzip funktioniert auch alles. Das einzige Problem:

Sobald DB-Einträge mit den Zeichen " oder & oder < erfolgen, wird der Datensatz nicht ausgelesen, d.h. die sms wird nicht gesendet!
Wenn ich den Datensatz in die App als String einbaue, werden diese auch ganz normal versendet....

Daraus schließe ich, das das Problem NUR am xml-Parser liegen kann...

Habt ihr evtl vorschläge, wie ich an das Problem drangehen kann?!
Die DB ist übrigens mit utf8_general_ci codiert

Danke an alle, die versuchen, mir zu helfen!!!

Zum Einloggen benutze ich folgenden code:

1client = new DefaultHttpClient();
2 HttpConnectionParams.setConnectionTimeout(client.getParams(), 15000);
3
4 try {
5
6 post = new HttpPost(stringReceiveURL);
7
8 List<NameValuePair> nvps = new ArrayList<NameValuePair>();
9
10 nvps.add(new BasicNameValuePair("username", login));
11 nvps.add(new BasicNameValuePair("password", pw));
12
13 post.setHeader("Content-Type", "application/x-www-form-urlencoded");
14 post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
15
16 } catch (Exception e) {
17 Log.d(TAG, e.toString());
18 }

zum Auslesen:

1try {
2 response = client.execute(post);
3 entity = response.getEntity();
4
5 InputStream is = entity.getContent();
6 SAXParserFactory spf = SAXParserFactory.newInstance();
7 SAXParser sp;
8
9 sp = spf.newSAXParser();
10 XMLReader xr = sp.getXMLReader();
11 LoginContentHandler uch = new LoginContentHandler();
12 xr.setContentHandler(uch);
13 xr.parse(new InputSource(is));
14 is.close();
15 if (entity != null)
16 entity.consumeContent();
17 } catch (ParserConfigurationException e) {
18 } catch (SAXException e) {
19 } catch (IOException e) {
20 }

Und zum Speichern der ausgelesenen Werte:

1public void startElement(String n, String l, String q, Attributes a) throws SAXException {
2
3 if (l == "login")
4 in_loginTag = true;
5 if (l == "user" && in_loginTag && a.getValue("an").toString() != "")
6 an = a.getValue("an").toString();
7 if (l == "user2" && in_loginTag && a.getValue("smsid") != "")
8 smsid = a.getValue("smsid").toString();
9 if (l == "user3" && in_loginTag && a.getValue("text").toString() != "")
10 text = a.getValue("text").toString();
11
12 if (l == "errors")
13 in_loginTag = false;
14
15 if (l == "error" && !in_loginTag && a.getValue("message").toString() != "")
16 error2 = a.getValue("message").toString();
17 }

Antworten
Markus B.
  • Forum-Beiträge: 636

20.06.2011, 23:19:56 via Website

Hi,
folgendes sagt die gute alte W3School zum Thema:

Characters like "<" and "&" are illegal in XML elements.

"<" will generate an error because the parser interprets it as the start of a new element.

"&" will generate an error because the parser interprets it as the start of an character entity.

Somit musst du dafür sorgen das die entsprechenden Characters escaped werden. Also & -> &amp; < -> &lt; .
Dann kann der Parser die Strings auch parsen.

Gruß,
Markus

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.068

20.06.2011, 23:21:44 via App

Du willst eine XML-Datei einlesen? Dann müssen die von Dir genannten Daten in CDATA stehen oder als Entity kodiert sein. Sonst ist die XML nicht valide und jeder Parser stolpert.

Die Tatsache, dass ich paranoid bin, heißt noch lange nicht, sie seien nicht hinter mir her!

Antworten
Gelöschter Account
  • Forum-Beiträge: 7

21.06.2011, 01:35:04 via Website

Hey danke!!!

Damit bin ich auf jedenfall schonmal auf dem richtigen Weg!!!

Leider finde ich keine Möglichkeit, den inhalt zwischen <user3 text="asdf"></user3> auszulesen...
das auslesen des attributes 'test' ist dabei kein Problem, allerdings klappt hier ja nicht mit dem cdata...

so wie ich das sehe, muss das so aussehen: <user3 text="ersterText"><![CDATA[asdf]]></user3>

Wie aber ist es möglich, auf den Inhalt des Tags zuzugreifen?!

PS: mit a = Attribut a.getValue(text) lese ich 'ersterText' aus....

Antworten
Gelöschter Account
  • Forum-Beiträge: 7

21.06.2011, 09:53:36 via Website

Ok hat sich erledigt :)

dazu hat ein einfaches htmlentities() in php gereicht :)

echo ('<user3 text="'.htmlentities($kid[message]).'" />');

Wer ansonsten Hilfe zu dem Thema braucht, findet hier sehr gute Hilfestellung:

http://www.uzi-web.de/xml/xml_entities.htm

vielen Dank für eure Bereitschaft zu helfen!!

UPS: mir ist aufgefallen, dass dann Umlaute dann nicht mehr funktionieren ! also besser: htmlspecialchars() verwenden!

— geändert am 21.06.2011, 10:05:46

Antworten