PHP SimpleXML XML öznitelikleri satır sonlarını korumak değildir

5 Cevap php

Ben onları satır sonları ile öznitelikleri dışarıdan sağlanan XML ayrıştırmak zorunda. SimpleXML kullanarak, satır sonları kaybolur gibi görünüyor. Göre another stackoverflow question, satır sonları geçerli olmalıdır (hatta ideal çok daha az olsa da!) XML için.

Neden onlar kaybolur? [Değiştir] And how can I preserve them? [/ edit]

Burada bir demo dosyası komut (satır sonları bir öznitelik olmadığı halde korunmuş olduğunu unutmayın).

PHP File with embedded XML

$xml = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<Rows>
    <data Title='Data Title' Remarks='First line of the row.
Followed by the second line.
Even a third!' />
    <data Title='Full Title' Remarks='None really'>First line of the row.
Followed by the second line.
Even a third!</data>
</Rows>
XML;

$xml = new SimpleXMLElement( $xml );
print '<pre>'; print_r($xml); print '</pre>';

Output from print_r

SimpleXMLElement Object
(
    [data] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [Title] => Data Title
                            [Remarks] => First line of the row. Followed by the second line. Even a third!
                        )

                )

            [1] => First line of the row.
Followed by the second line.
Even a third!
        )

)

5 Cevap

Yeni bir hat için bir varlıktır &#10;. Ben hile yaptım bir şey bulana kadar ben senin kodu ile oynadı. Çok zarif değil, ben sizi uyarmak:

//First remove any indentations:
$xml = str_replace("     ","", $xml);
$xml = str_replace("\t","", $xml);

//Next replace unify all new-lines into unix LF:
$xml = str_replace("\r","\n", $xml);
$xml = str_replace("\n\n","\n", $xml);

//Next replace all new lines with the unicode:
$xml = str_replace("\n","&#10;", $xml);

Finally, replace any new line entities between >< with a new line:
$xml = str_replace(">&#10;<",">\n<", $xml);

Varsayım, sizin örnekte dayanarak, bir düğüm ya da niteliğin içinde oluşabilecek yeni çizgiler < yeni bir öğe açmak için, bir sonraki satırda daha fazla metin değil sahip olmasıdır.

Bir sonraki satır satır-düzeyinde eleman sarılmış bir metni olsaydı tabii bu başarısız olur.

SimpleXML kullanarak, satır sonları kaybolur gibi görünüyor.

Evet, bu aslında basit bir boşluğu temsil nitelik değerleri satırsonlarının Herhangi bir uyumlu XML ayrıştırıcı gereklidir ... bekleniyor. XML spec attribute value normalisation bakın.

Öznitelik değeri gerçek bir satır karakteri olması gerekiyordu ise, XML &#10; karakter referansı yerine bir ham satırsonunu dahil olmalıdır.

Bu çözümleyici gönderilmeden önce $ XMLDATA XML dizesi olduğunu varsayarak, bu doğru varlık olan özelliklerde tüm satırsonu değiştirmeniz gerekir. Ben XML SQL Server gelen ile sorunu vardı.

$parts = explode("<", $xmlData); //split over <
array_shift($parts); //remove the blank array element
$newParts = array(); //create array for storing new parts
foreach($parts as $p)
{
    list($attr,$other) = explode(">", $p, 2); //get attribute data into $attr
    $attr = str_replace("\r\n", "&#10;", $attr); //do the replacement
    $newParts[] = $attr.">".$other; // put parts back together
}
$xmlData = "<".implode("<", $newParts); // put parts back together prefixing with <

Muhtemelen bir regex ile daha basitçe yapılabilir, ama bu benim için güçlü bir nokta değil olabilir.

Bu benim için çalıştı budur:

İlk olarak, bir dize olarak xml olsun:

    $xml = file_get_contents($urlXml);

Sonra değiştirme yapın:

    $xml = str_replace(".\xe2\x80\xa9<as:eol/>",".\n\n<as:eol/>",$xml);

"." ve "" Ben bu durumda sonları eklemek için gerekli çünkü vardı. Yeni hatlar "\ n" ne gibi değiştirilebilir.

Değiştirdikten sonra, sadece bir SimpleXMLElement nesnesi olarak xml-dize yüklenemedi:

    $xmlo = new SimpleXMLElement( $xml );

Et Voilà

Well, this question is old but like me, someone might come to this page eventually. I had slightly different approach and I think the most elegant out of these mentioned.

Xml içinde, size yeni hat için kullanacağız bazı benzersiz kelime koymak.

Xml değiştirin

<data Title='Data Title' Remarks='First line of the row. \n
Followed by the second line. \n
Even a third!' />

Eğer dize çıkışı SimpleXML istenen düğüme yol olsun Ve sonra böyle bir şey yazmak:

$findme  = '\n';
$pos = strpos($output, $findme);
if($pos!=0)
{
$output = str_replace("\n","<br/>",$output);

Bu '\ n olmak zorunda değildir, herhangi bir benzersiz karakter olabilir.