2016-05-11 19 views
2

Ich versuche, eine XML-Datei mit einigen der Werte zu generieren, die Sonderzeichen wie μmol/l, x10³ Zellen/μl und viele mehr enthält. benötigen auch Funktionalität, um hochgestellt zu setzen.Sonderzeichen in XML mit PHP

kodierten I den Text & mgr; mol/l bis etwa wie folgt eine Funktion von ordutf8 php.net Verwendung

& # 956 & # 109 & # 111 & # 108 & # 47 & # 108

Ich habe diesen Code erfolgreich wieder in "richtext" konvertiert mit PHPExcel, um Excel-Dokumente und PDF zu generieren, b Ich muss es jetzt in ein XML-Format einfügen.

Wenn ich die & # Zeichen verwenden wie ich eine Fehlermeldung erhalten, sagen

SimpleXMLElement :: addChild(): ungültige Dezimalzeichen Wert

Hier mehr Werte Ich habe in der Datenbank, die "XML" freundlich

& # 120 & # 49 gemacht werdenmuss# 48 & 60 # & # 115 & # 117 & # 112 & # 62 & # 54 & # 60 & 47 # & # 115 & # 117 & # 112 & # 62 & 32 # & # 99 & # 101 & # 108 & # 108 & # 115 & # 47 & # 181 & # 108

von x10 Umbau Zellen/μl

Antwort

3

Hier müssen Sie diese Zeichen nicht codieren. XML-Zeichenfolgen können UTF-8 oder eine andere Codierung verwenden. Abhängig von der Codierung wird der Serializer bei Bedarf codieren.

$foo = new SimpleXmlElement('<?xml version="1.0" encoding="UTF-8"?><foo/>'); 
$foo->addChild('bar', 'μmol/l, x10³ cells/µl'); 
echo $foo->asXml(); 

Ausgabe (Sonderzeichen codiert nicht):

<?xml version="1.0" encoding="UTF-8"?> 
<foo><bar>μmol/l, x10³ cells/µl</bar></foo> 

Einheiten für die Sonderzeichen Um zu erzwingen, müssen Sie die Codierung ändern:

$foo = new SimpleXmlElement('<?xml version="1.0" encoding="ASCII"?><foo/>'); 
$foo->addChild('bar', 'μmol/l, x10³ cells/µl'); 
echo $foo->asXml(); 

Ausgang (Sonderzeichen codiert) :

<?xml version="1.0" encoding="ASCII"?> 
<foo><bar>&#956;mol/l, x10&#179; cells/&#181;l</bar></foo> 

Ich schlage vor, dass Sie Ihre benutzerdefinierte Codierung zurück in UTF-8 konvertieren. Auf diese Weise kann die XML Api sich darum kümmern. Wenn Sie eine Zeichenfolge mit der benutzerdefinierten Kodierung speichern möchten, müssen Sie um arbeiten.

Eine Zeichenfolge wie &#120&#49&#48&#60&#115&#117 löst einen Fehler in SimpleXML/DOM aus. Das zweite Argument von SimpleXMLElement::addChild() und DOMDocument::createElement() haben ein gebrochenes entkommen. Sie müssen den Inhalt als Textknoten erstellen und anhängen.

Hier ist eine kleine Klasse, die SimpleXMLElement und fügt eine Abhilfe erweitert:

class MySimpleXMLElement extends SimpleXMLElement { 

    public function addChild($nodeName, $content = NULL) { 
    $child = parent::addChild($nodeName); 
    if (isset($content)) { 
     $node = dom_import_simplexml($child); 
     $node->appendChild($node->ownerDocument->createTextNode($content)); 
    } 
    return $child; 
    } 
} 

$foo = new MySimpleXmlElement('<?xml version="1.0" encoding="UTF-8"?><foo/>'); 
$foo->addChild('bar', '&#120&#49&#48&#60&#115&#117'); 
echo $foo->asXml(); 

Ausgang:

<?xml version="1.0" encoding="UTF-8"?> 
<foo><bar>&amp;#120&amp;#49&amp;#48&amp;#60&amp;#115&amp;#117</bar></foo> 

Die & aus Ihrer benutzerdefinierten Codierung als &amp; Einheit entkommen lassen - weil es eine ist Sonderzeichen in XML. Der XML-Parser wird es entschlüsseln.

$xml = <<<'XML' 
<?xml version="1.0" encoding="UTF-8"?> 
<foo><bar>&amp;#120&amp;#49&amp;#48&amp;#60&amp;#115&amp;#117</bar></foo> 
XML; 

$foo = new SimpleXMLElement($xml); 
var_dump((string)$foo->bar); 

Output:

string(27) "&#120&#49&#48&#60&#115&#117" 
+0

Ich habe diese Werte in der Datenbank ... & # 120 & # 49 & # 48 & # 60 & # 115 & # 117 & # 112 & # 62 & # 54 & # 60 & # 47 & # 115 & # 117 & # 112 & # 62 & # 32 & # 99 & # 101 & # 108 & # 108 & # 115 & # 47 & # 181 & # 108 –