2010-07-19 38 views
5

Bu yüzden bir Word belgesindeki bazı metni düzenlemem gerekiyor. Bir Word belgesi oluşturdum ve XML olarak kaydettim. Doğru bir şekilde kaydedildi (XML dosyasını MS Word'de açabilirim ve docx orijinaline benziyor). Bu düzgün işletilirsePHP'de sorun düzenleme word dosyası

<?php 

$firstName = 'Richard'; 
$lastName = 'Knop'; 

$xml = file_get_contents('template.xml'); 

$doc = new DOMDocument(); 
$doc->loadXML($xml); 
$doc->preserveWhiteSpace = false; 

$wts = $doc->getElementsByTagNameNS('http://schemas.openxmlformats.org/wordprocessingml/2006/main', 't'); 

$c1 = 0; $c2 = 0; 
foreach ($wts as $wt) { 

    if (1 === $c1) { 
     $wt->nodeValue .= ' ' . $firstName; 
     $c1++; 
    } 

    if (1 === $c2) { 
     $wt->nodeValue .= ' ' . $lastName; 
     $c2++; 
    } 

    if ('First Name' === substr($wt->nodeValue, 0, 10)) { 
     $c1++; 
    } 

    if ('Last Name' === substr($wt->nodeValue, 0, 9)) { 
     $c2++; 
    } 

} 

$xml = str_replace("\n", "\r\n", $xml); 

$fp = fopen('final-xml.xml', 'w'); 
fwrite($fp, $xml); 
fclose($fp); 

(hiçbir hata): - (zaten çalışma versiyonunu sabittir feryat DÜZENLEME)

Ondan sonra (sadece iki satır) dosyasında bazı metin düzenlemek için PHP DOM kullanın. Bu iki satır:

<w:t>First Name:</w:t> 
<w:t>Last Name:</w:t> 

bu değiştirilir alın: Ancak

<w:t>First Name: Richard</w:t> 
<w:t>Last Name: Knop</w:t> 

, MS Word son-xml.xml dosyayı açmaya çalıştığınızda, bu açılmıyor (Word donar) . Baska öneri.

DÜZENLEME:

I() Levenstein kullanarak çalıştı:

$xml = file_get_contents('template.xml'); 
$xml2 = file_get_contents('final-xml.xml'); 

$str = str_split($xml, 255); 
$str2 = str_split($xml2, 255); 

$i = 0; 
foreach ($str as $s) { 
    $dist = levenshtein($s, $str2[$i]); 
    if (0 <> $dist) { 
     echo $dist, '<br />'; 
    } 
    $i++; 
} 

şey outputted.

Bu garip. Son-xml.xml dosyasını not defterinde açtığımda, bu iki çizginin değiştiğini açıkça görebiliyorum.

EDIT2: http://uploading.com/files/61b2922b/template.xml/

+0

bu bir karakter kodlaması sorun olabilir mi? –

+1

, aslında yaptığınız tek değişiklik olduğunu doğrulamak için orijinali ve sonucu değiştirebilir misiniz? – mvds

+0

Her iki XML dosyasını denemek ve ayırt etmek için array_diff kullanacağım. –

cevap

7

Bu, UNIX satır sonları vs DOS ile ilgili bir sorun: Burada

template.xml dosyasıdır. Word 2007, \n satır sonunu tolere etmez, \r\n gerektirir, ancak Word 2010 daha toleranslıdır ve her iki sürümü de kabul eder.

tüm UNIX hat çıktı dosyasını kaydetmeden önce DOS olanlarla kırar yerine emin olun sorunu çözmek için:

$xml = str_replace("\n", "\r\n", $xml); 

Tam örnek:

<?php 

$firstName = 'Richard'; 
$lastName = 'Knop'; 

$xml = file_get_contents('template.xml'); 

$doc = new DOMDocument(); 
$doc->loadXML($xml); 
$doc->preserveWhiteSpace = false; 

$wts = $doc->getElementsByTagNameNS('http://schemas.openxmlformats.org/wordprocessingml/2006/main', 't'); 

foreach ($wts as $wt) { 
    echo $wt->nodeValue; 

    if ('First Name:' === $wt->nodeValue) { 
     $wt->nodeValue = 'First Name: ' . $firstName; 
    } 

    if ('Last Name:' === substr($wt->nodeValue, 0, 10)) { 
     $wt->nodeValue = 'Last Name: ' . $lastName; 
    } 
} 

$xml = $doc->saveXML(); 

// Replace UNIX with DOS line endings 
$xml = str_replace("\n", "\r\n", $xml); 

$fp = fopen('final-xml.xml', 'w'); 
fwrite($fp, $xml); 
fclose($fp); 
?> 
+0

Harika! Sen bir soydasın. Teşekkürler! –

0

XML Word dosyaları belli toplamlarını depolamış domun tepesine yakın (hatırlamama). Boyutu veya genel sağlama toplamı gibi bunları değiştirmeniz gerekebilir.

Bu, bir HTML dosyası haline getirme ve kaydetme yetkisine sahip olduğumda (aptalca) bu sorunun benim olduğunu biliyorum; bu, içinde sadece düzenleme yapmak için kullanılan binlerce işe yaramaz şey var.

+1

Bunlar sağlama toplamı değil, yalnızca belge kaydedildikten sonra Word tarafından güncellenecek olan meta veriler. –

İlgili konular