Archiv verlassen und diese Seite im Standarddesign anzeigen : xml encoding per script setzen?
darki777 26-08-2007, 06:09 Hi,
ist es irgendwie möglich den encoding Wert eines bestehenden XML
Dokuments per php script abzuändern? Bzw. auch beim Initialisieren
eines solchen? Sowas wie setEncoding("utf-8"); wäre ganz
praktisch, hoffe jemand weis vieleicht wie das geht.
Noch ne gute Nacht (od. guten Morgen ;) Gruß darki
tontechniker 26-08-2007, 11:13 Um die Kodierung musst du dich imho selber kümmern, dass heißt XML auslesen -> umkodieren (utf_encode) -> neu schreiben.
penizillin 26-08-2007, 11:26 iconv
darki777 26-08-2007, 14:13 utf_encode kenn ich bringt mir hier aber absolut nix,
ich brauch ne reine XML Ausgabe die die Zeile:
<?xml version='1.0'?>
in die Zeile:
<?xml version='1.0' standalone='yes' encoding='utf-8'?>
abwandelt (bzw. das XML Objekt abändert), die XML wird
dann von Flash weiter ausgelesen, der guckt dann auf
was der parameter "encoding" gesetzt ist und arbeitet
das dann je nach format ab. Hoffe ihr wisst jez was ich
meine, daher war meine Frage ob es eine Funktion für
sowas gibt, ich könnt natürlich die erste Zeile per PHP
einfach so auslesen und den String direkt abändern und
dann wieder einsetzen, aber genau dass wollt ich
verhindern, wäre ja nicht gerade die professionellste Lösung.
Ich will ja je nach Gebrauch die Parameter erweitern,
daher wäre eine einfache set-Methode für sowas ganz
praktisch.
Gruß darki
darki777 26-08-2007, 17:51 Habe mir jez nen Art "parser" gebaut wo man den Header
der XML verändern kann, hab die Klasse noch nicht auf alles
getestet, also wenn irgendwo Fehler auftretten sagt bescheid,
vieleicht hilft es ja dem ein oder anderen, hier der Code:
<?php
class xml_header_parser
{
private $xml;
private $xml_header;
private $xml_body;
private $version;
private $encoding;
private $standalone;
function __construct($xml,$version="1.0",$encoding="utf-8",$standalone=null)
{
$this->set_xml($xml);
$this->set_version($version);
$this->set_encoding($encoding);
$this->set_standalone($standalone);
}
function set_xml($xml)
{
$a = strpos($xml,"<?");
$b = strpos($xml,"?>");
$this->xml_header = substr($xml,$a,$b+2);
$this->xml_body = substr($xml,$b+2);
$this->xml = $xml;
}
function set_version($version)
{
if(empty($version))
$this->version = $this->string_between($this->xml_header,"version=");
else
$this->version = $version;
}
function set_encoding($encoding)
{
if(empty($encoding))
$this->encoding = $this->string_between($this->xml_header,"encoding=");
else
$this->encoding = $encoding;
}
function set_standalone($standalone)
{
if(empty($standalone))
$this->standalone = $this->string_between($this->xml_header,"standalone=");
else
$this->standalone = $standalone;
}
function get_xml()
{
return $this->xml;
}
function get_xml_header()
{
$tmp_version = (!empty($this->version)) ? " version='{$this->version}'" : null;
$tmp_standalone = (!empty($this->standalone)) ? " standalone='{$this->standalone}'" : null;
$tmp_encoding = (!empty($this->encoding)) ? " encoding='{$this->encoding}'" : null;
return "<?xml{$tmp_version}{$tmp_standalone}{$tmp_encoding}?>";
}
function get_xml_body()
{
return $this->xml_body;
}
function get_version()
{
return $this->version;
}
function get_encoding()
{
return $this->encoding;
}
function get_standalone()
{
return $this->standalone;
}
function generate_XML()
{
return $this->get_xml_header() . $this->get_xml_body();
}
private function string_between($xml,$str,$splitter="'")
{
$tmp = split(" ",$xml);
foreach($tmp as $counter => &$value)
{
if(stristr($value,$str))
{
$a = stripos($value,$splitter);
$b = stripos($value,$splitter,$a+1);
$l = $b-$a;
$str = substr($value,$a+1,$l-1);
return $str;
}
}
}
}
// Testbeispiel:
$myXML = "<?xml version='1.0' standalone='yes' encoding='utf-8'?><root>bla</root>";
$xml = new xml_header_parser($myXML);
$xml->set_encoding("iso");
print_r($xml->generate_XML());
?>
[EDIT (2007-08-26):] Hab die Version nochmal überarbeitet.
Viele Grüße, darki
penizillin 27-08-2007, 02:10 also ist das problem ein ganz anderes, als im eingans-posting beschrieben? ok. blöd gelaufen. wenn man mit dom arbeitet, gibt es für DOMDocument entsprechende attribute, die man nach belieben einstellen kann (stehen alle im manual). dass diese angabe allerdings eng mit der tatsächlichen kodierung der datei korreliert, ist dir anscheinend unbewusst?
darki777 27-08-2007, 08:59 Ja, war wohl falsch von mir formuliert. Was meinst du mit "korreliert"?
Was sollte da korrelieren, also bei mir kommt z.B. valides XML wie das
hier raus:
<?xml version='1.0' encoding='utf-8'?>
<root><file_0><file_path><![CDATA[dir0/Anschrift.txt]]></file_path><file><![CDATA[Anschrift.txt]]></file><dir><![CDATA[dir0/]]></dir><dir_depth><![CDATA[1]]></dir_depth></file_0></root>
Hmm, hätt mir wohl mit DOM einiges ersparren können,
bzw. mein SimpleXML Objekt in DOM konvertieren,
Header ändern und wieder zurückwandeln, danke für
den Tip. Allerdings würd ich das mit der Kolleration
trotzdem aus Interesse gerne wissen :)
[EDIT:] [name: doctype] [type: DOMDocumentType] [readonly: yes],
hab zwar nachgeschlagen, aber irgendwie scheinen die Eigenschaften
nicht abänderbar/beschreibbar zu sein oder versteh ich da was falsch?
Gruß darki
penizillin 27-08-2007, 13:48 hab zwar nachgeschlagen, aber irgendwie scheinen die Eigenschaften nicht abänderbar/beschreibbar zu sein oder versteh ich da was falsch? einfach weiterlesen.
Was meinst du mit "korreliert"? die angabe ist nicht einfach ein string, der ganz nett ausschaut, sondern muss genau die kodierung beschreiben, in der die datei kodiert ist. also reicht i.a. nicht "einfach das attribut ändern".
darki777 27-08-2007, 15:14 Werd mir das mal in Ruhe durchlesen, aber das mit dem String
funzt dennoch ohne Probleme, ich kann die XML einfach
weiterverarbeiten und wieder in ein simpleXML Objekt konvertieren,
also scheint nicht wirklich probs zu geben. Außer in meinem speziellen
Beispiel bei den CDATA Tags, wo ich aber schon davor probs hatte, da
simpleXML bekanntlich CDATA ned so gern mag.
Allerdings brauch ich das Zeug sowieso fürn Flashparser, und der
ließt mir das dann alles ordentlich aus. Also der Header lässt sich
mit der Klasse ohne Probleme ändern und funzt in php sowie in
actionscript, solang ich keine fehler seh benutz ich meine Klasse,
dann brauch ich nicht ständig von simpleXML nach DOM und wieder
nach simpleXML konvertieren. Danke nochmal für die Bemühungen,
DOM probier ich dann mal bei nem anderen Projekt aus.
Gruß darki
|
-
- |