2013-03-28 30 views
6

Tôi phải đọc một số tệp XML khá nặng (từ 200 MB đến 1 GB), đối với một số tệp không hợp lệ. Để tôi cho bạn một ví dụ nhỏ:PHP - Đọc và sửa chữa các tệp XML không hợp lệ lớn

<?xml version="1.0" encoding="UTF-8"?> 
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0"> 
    <item> 
    <title>Some article</title> 
    <g:material><ul><li>50 % Coton</li><li>50% Lyocell</li></g:material> 
    </item> 
</rss> 

Rõ ràng, có một thiếu </ul> thẻ đóng trong thẻ g:material. Hơn nữa, những người đã phát triển nguồn cấp dữ liệu này nên có kèm theo g:material nội dung vào CDATA, mà họ không ... Về cơ bản, đó là những gì tôi muốn làm: thêm phần thiếu CDATA này.

Tôi đã cố gắng sử dụng trình phân tích SAX để đọc tệp này nhưng không thành công khi đọc thẻ </g:material> do thiếu thẻ </ul>. Tôi đã thử với XMLReader nhưng về cơ bản là cùng một vấn đề. Tôi có thể làm điều gì đó với DomDocument :: loadHtml nhưng kích thước của tệp này không thực sự tương thích với cách tiếp cận DOM. Bạn có bất kỳ ý tưởng làm thế nào tôi chỉ có thể sửa chữa thức ăn này mà không cần phải mua rất nhiều RAM cho DomDocument để làm việc? Cảm ơn.

+0

có họ nên làm điều đó. bạn luôn có thể thử regexp tìm/thay thế tất cả các tệp của bạn nếu bạn biết nơi có vấn đề. nhưng nó không phải là mối quan tâm của bạn ngay từ đầu. – mpm

+0

Hey Rémi, bạn không thể đọc chuỗi, do đó thêm các phần CDATA, trước khi bạn đẩy nó vào bộ tải xml của bạn? – brisssou

+0

Vâng, đó là những gì tôi đã suy nghĩ và những gì tôi đang làm ngay bây giờ nhưng tôi vẫn hy vọng có suy nghĩ tốt hơn để làm hơn đọc ký tự XML theo ký tự hoặc tìm/thay thế bằng regexp :) – Remi

Trả lời

3

Nếu các tệp quá lớn để sử dụng tiện ích mở rộng Tidy, bạn có thể sử dụng tidy CLI tool để làm cho tệp có thể phân tích cú pháp.

$ tidy -output my.clean.xml my.xml 

Sau đó, các tệp XML được định dạng tốt để bạn có thể phân tích cú pháp chúng bằng XMLReader. Kể từ khi gọn gàng thêm các phần HTML 'thiếu' (X), mã của tài liệu gốc của bạn nằm bên trong phần tử.

+0

ops, bạn có thể sử dụng tiện ích mở rộng Tidy cho các tệp lớn (xem câu trả lời của tôi bên dưới). Và bạn có thể sử dụng PHP như một lệnh để chuyển đổi các tệp HTML thành XHTML bằng thiết bị đầu cuối. –

0

(sao chép từ https://stackoverflow.com/a/17903058/287948)

Tóm tắt như hai bước sau:

  1. Sử dụng Tidy biến "HTML miễn phí" vào "XHTML tốt".
  2. Sử dụng Trình phân tích cú pháp XML để phân tích cú pháp XHTML dưới dạng XML theo SAX API.

Sử dụng đầu tiên Tidy (!), Để chuyển hóa "HTML miễn phí" vào XHTML (hoặc khi bạn không thể tin tưởng "phải XHTML" của bạn). Xem phương thức cleanRepair. Nó cần nhiều thời gian hơn, nhưng chạy với các tệp lớn (!) ... Set some minutes as maximum execution time nếu quá lớn.

Một tùy chọn khác (để làm việc với tệp lớn) là lưu vào bộ nhớ cache các tệp XHTML của bạn sau khi được chọn hoặc chuyển thành XHTML. Xem phương pháp repairfile của Tidy.

Với "XHTML đáng tin cậy", sử dụng SAX ... Cách sử dụng SAX với PHP?

Parse XML với một SAX standard API, mà trong PHP được thực hiện bởi LibXML (xem libxml2 tại xmlsoft.org), và giao diện của nó là PHP's XML Parser, đó là gần với tiêu chuẩn SAX API.

Một cách khác để sử dụng "SAX của libxml2", với giao diện khác (một thay vì giao diện truyền thống SAX PHP iterator), là sử dụng XMLReader.Xem this explanation about "XMLReader use SAX".


Có, các thuật ngữ "SAX" hoặc "API SAX" không được thể hiện trong hướng dẫn sử dụng PHP (!). Xem this old but good introduction.

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