2016-05-11 3 views
2

私は、μmol/ l、x103 cells /μlなどの特殊文字を含む値のいくつかをXMLファイルとして生成しようとしています。上付き文字を入れる機能も必要です。PHPを使用したXMLの特殊文字

Iはphp.net

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

からordutf8関数を使用してこのようなものにテキストモル/ Lをコード
function ords_to_unistr($ords, $encoding = 'UTF-8'){ 
    // Turns an array of ordinal values into a string of unicode characters 
    $str = ''; 
    for($i = 0; $i < sizeof($ords); $i++){ 
     // Pack this number into a 4-byte string 
     // (Or multiple one-byte strings, depending on context.)    
     $v = $ords[$i]; 
     $str .= pack("N",$v); 
    } 
    $str = mb_convert_encoding($str,$encoding,"UCS-4BE"); 
    return($str);   
} 

function unistr_to_ords($str, $encoding = 'UTF-8'){  
    // Turns a string of unicode characters into an array of ordinal values, 
    // Even if some of those characters are multibyte. 
    $str = mb_convert_encoding($str,"UCS-4BE",$encoding); 
    $ords = array(); 

    // Visit each unicode character 
    for($i = 0; $i < mb_strlen($str,"UCS-4BE"); $i++){  
     // Now we have 4 bytes. Find their total 
     // numeric value. 
     $s2 = mb_substr($str,$i,1,"UCS-4BE");     
     $val = unpack("N",$s2);   
     $ords[] = $val[1];    
    }  
    return($ords); 
} 

PHPExcelを使用してこのコードを「richtext」に変換してExcelドキュメントとPDFを生成しました.b私は今それをXMLに入れる必要があります。

私は

にSimpleXMLElementを言うエラーメッセージが出ているとして、私は&#文字を使用する場合は::にaddChild():ここでは無効な小数点文字値

は私が持っているより多くの値であり、 "XML" 優しい

&行わなければ#120 &#49を必要とするデータベース#48 &#60 &#115 &#117 &#112 &#62 &#54 &#60 &#47 &#115 &#117 &#112 &#62 &#32 &#99 &#101 &# 108 &#108 &#115 &#47 &#181 &#108 X10から変換

細胞/μl

答えて

3

これらの文字をエンコードする必要はありません。 XML文字列は、UTF-8または別のエンコーディングを使用できます。シリアライザは、エンコーディングに応じて必要に応じてエンコードします。

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

出力(特殊文字はエンコードされません):

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

特殊文字のエンティティを強制するために、あなたはエンコーディングを変更する必要があります。

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

出力(特殊文字はエンコードされました) :

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

カスタムエンコーディングをUTF-8に変換することをお勧めします。そうすれば、XML APIを使って処理することができます。カスタムエンコードでストリングを保存したい場合は、a bugを回避する必要があります。

&#120&#49&#48&#60&#115&#117のような文字列は、SimpleXML/DOMのバグを引き起こします。 SimpleXMLElement::addChild()DOMDocument::createElement()の2番目の引数には壊れたエスケープがあります。テキストノードとしてコンテンツを作成して追加する必要があります。ここで

はのSimpleXMLElementを拡張し、回避策を追加する小さなクラスです:

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(); 

出力:

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

カスタムエンコーディングから&が実体&amp;としてエスケープされます - それがあるため、 XMLの特殊文字。 XMLパーサーがそれをデコードします。

$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); 

出力:

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

私は、データベース内のこれらの値を持っている...&#120&#49&#48&#60&#115&#117&#112&#62&#54&#60&#47&#115& #117&#112&#62&#32&#99&#101&#108&#108&#115&#47&#181&#108 –

関連する問題