2010-07-19 34 views
5

Vì vậy, tôi cần chỉnh sửa một số văn bản trong tài liệu Word. Tôi đã tạo một tài liệu Word và lưu nó dưới dạng XML. Nó được lưu một cách chính xác (tôi có thể mở tập tin XML trong MS Word và nó trông giống như bản gốc docx).Sửa lỗi tệp từ trong PHP

Vì vậy, sau đó tôi sử dụng PHP DOM để chỉnh sửa một số văn bản trong tập tin (chỉ cần hai dòng) (EDIT - dưới đây đã được cố định phiên bản làm việc):

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

này được thực hiện đúng cách (không có lỗi). Hai dòng này:

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

Nhận thay thế bằng những:

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

Tuy nhiên, khi tôi cố gắng để mở tập tin cuối cùng-xml.xml trong MS Word, nó không mở (Word đóng băng) . Bất kỳ đề xuất.

EDIT:

tôi đã cố gắng sử dụng Levenstein():

$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++; 
} 

nào outputted gì.

Điều kỳ lạ. Khi tôi mở tệp final-xml.xml trong notepad, tôi có thể thấy rõ ràng rằng hai dòng đó đã thay đổi.

EDIT2:

Dưới đây là file template.xml: http://uploading.com/files/61b2922b/template.xml/

+0

đây có phải là sự cố mã hóa ký tự không? –

+1

bạn có thể 'diff' bản gốc và kết quả, để xác minh rằng đây là thực tế thay đổi duy nhất bạn đã thực hiện? – mvds

+0

Tôi sẽ sử dụng array_diff để thử và phân biệt cả hai tệp XML. –

Trả lời

7

Đây là vấn đề liên quan đến hệ điều hành DOS vs kết thúc dòng UNIX. Word 2007 không chấp nhận một dòng kết thúc \n, nó yêu cầu \r\n trong khi Word 2010 là khoan dung hơn và chấp nhận cả hai phiên bản.

Để khắc phục vấn đề chắc chắn rằng bạn thay thế tất cả các dòng UNIX phá vỡ với những hệ điều hành DOS trước khi lưu các tập tin đầu ra:

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

Full mẫu:

<?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

Tuyệt vời! Bạn là một genious. Cảm ơn! –

0

XML file Word đã tổng kiểm tra một số lưu trữ gần đầu của dom (để hồi ức của tôi). Bạn có thể phải thay đổi chúng, chẳng hạn như kích thước, hoặc tổng kiểm tra chính nó.

Tôi biết đây là vấn đề của tôi khi tôi (câm) đủ để tạo một tệp HTML bằng văn bản và lưu nó, nó có hàng nghìn thứ vô dụng trong đó chỉ phục vụ cho việc chỉnh sửa tồi tệ hơn.

+1

Đây không phải là tổng kiểm tra, chúng chỉ là dữ liệu meta sẽ được Word cập nhật khi tài liệu được lưu lại. –

Các vấn đề liên quan