2012-05-06 86 views
12

Tôi đã có rất nhiều tệp HTML cần được kết hợp trong XML. Chúng tôi đang sử dụng các HTML này để phục vụ nội dung cho các ứng dụng nhưng bây giờ chúng tôi phải phục vụ các nội dung này dưới dạng XML.Chuyển đổi HTML sang XML

file HTML chứa, bảng biểu, của div, hình ảnh của, p của, thẻ b hoặc mạnh, vv ..

Tôi googled và thấy một số ứng dụng, nhưng tôi không thể đạt được nêu ra.

Bạn có thể đề xuất cách chuyển đổi các nội dung tệp này sang XML không?

+0

Hãy xem [bài đăng này] (http://stackoverflow.com/a/85922/938089). Sau đó, có một cái nhìn rất gần [bình luận thứ tư] (http://stackoverflow.com/questions/84556/#comment1436887_85922). Tại sao bạn muốn chuyển đổi HTML sang XML? –

+0

@RobW tôi sẽ kiểm tra. Chúng tôi đã phân phối HTML dưới dạng nội dung cho một số ứng dụng nhưng giờ đây chúng tôi phải phân phát dưới dạng XML. –

+0

@RobW, tôi cũng biết sự khác biệt giữa XML và HTML. Nhưng tôi cần phải phân tích nội dung của nó và đưa vào XML. –

Trả lời

15

tôi đã thành công sử dụng tiện ích dòng lệnh tidy. Trên linux tôi đã cài đặt nó nhanh chóng với apt-get install tidy. Sau đó lệnh:

tidy -q -asxml --numeric-entities yes source.html >file.xml

đưa ra một tập tin xml, mà tôi đã có thể xử lý với bộ xử lý XSLT. Tuy nhiên tôi cần thiết để thiết lập xhtml1 dtds một cách chính xác.

Đây là trang chủ: html-tidy.org (và những di sản một: HTML Tidy)

+4

Ngoài ra còn có xmllint -html -xmlout –

+2

Tôi cũng sử dụng nó đôi khi. Tôi nghĩ bạn nên làm một câu trả lời riêng biệt từ nó. – Jarekczek

+0

hiện nó loại bỏ javascript từ tập tin html – Alaa

1

Hãy nhớ rằng HTML và XML là hai khái niệm riêng biệt trong cây ngôn ngữ đánh dấu. Bạn không thể chính xác replace HTML with XML. XML có thể được xem như một dạng HTML tổng quát, nhưng thậm chí là không chính xác. Bạn chủ yếu sử dụng HTML để hiển thị dữ liệu và XML để thực hiện (hoặc lưu trữ) dữ liệu.

liên kết này là hữu ích: How to read HTML as XML?

More here - difference between HTML and XML

+0

HTML __is__ XML. – bfontaine

+10

@boudou. Không, XHTML là XML, HTML thì không. – Bruno

+1

Vì vậy, những gì bạn đề nghị? Nếu tôi trước hết chuyển đổi HTML thành XHTML thì tôi có thể dễ dàng chuyển đổi trong XML không? –

2

tôi đã tìm ra một cách để chuyển đổi (thậm chí xấu) html vào XML cũng được hình thành. Tôi bắt đầu dựa trên hàm DOM loadHTML này. Tuy nhiên trong thời gian một số vấn đề xảy ra và tôi tối ưu hóa và thêm các bản vá lỗi để sửa các tác dụng phụ.

function tryToXml($dom,$content) { 
    if(!$content) return false; 

    // xml well formed content can be loaded as xml node tree 
    $fragment = $dom->createDocumentFragment(); 
    // wonderfull appendXML to add an XML string directly into the node tree! 

    // aappendxml will fail on a xml declaration so manually skip this when occurred 
    if(substr($content,0, 5) == '<?xml') { 
     $content = substr($content,strpos($content,'>')+1); 
     if(strpos($content,'<')) { 
     $content = substr($content,strpos($content,'<')); 
     } 
    } 

    // if appendXML is not working then use below htmlToXml() for nasty html correction 
    if([email protected]$fragment->appendXML($content)) { 
     return $this->htmlToXml($dom,$content); 
    } 

    return $fragment; 
    } 



    // convert content into xml 
    // dom is only needed to prepare the xml which will be returned 
    function htmlToXml($dom, $content, $needEncoding=false, $bodyOnly=true) { 

    // no xml when html is empty 
    if(!$content) return false; 

    // real content and possibly it needs encoding 
    if($needEncoding) { 
     // no need to convert character encoding as loadHTML will respect the content-type (only) 
     $content = '<meta http-equiv="Content-Type" content="text/html;charset='.$this->encoding.'">' . $content; 
    } 

    // return a dom from the content 
    $domInject = new DOMDocument("1.0", "UTF-8"); 
    $domInject->preserveWhiteSpace = false; 
    $domInject->formatOutput = true; 

    // html type 
    try { 
     @$domInject->loadHTML($content); 
    } catch(Exception $e){ 
     // do nothing and continue as it's normal that warnings will occur on nasty HTML content 
    } 
     // to check encoding: echo $dom->encoding 
     $this->reworkDom($domInject); 

    if($bodyOnly) { 
     $fragment = $dom->createDocumentFragment(); 

     // retrieve nodes within /html/body 
     foreach($domInject->documentElement->childNodes as $elementLevel1) { 
     if($elementLevel1->nodeName == 'body' and $elementLevel1->nodeType == XML_ELEMENT_NODE) { 
     foreach($elementLevel1->childNodes as $elementInject) { 
      $fragment->insertBefore($dom->importNode($elementInject, true)); 
     } 
     } 
     } 
    } else { 
     $fragment = $dom->importNode($domInject->documentElement, true); 
    } 

    return $fragment; 
    } 



    protected function reworkDom($node, $level = 0) { 

     // start with the first child node to iterate 
     $nodeChild = $node->firstChild; 

     while ($nodeChild) { 
      $nodeNextChild = $nodeChild->nextSibling; 

      switch ($nodeChild->nodeType) { 
       case XML_ELEMENT_NODE: 
        // iterate through children element nodes 
        $this->reworkDom($nodeChild, $level + 1); 
        break; 
       case XML_TEXT_NODE: 
       case XML_CDATA_SECTION_NODE: 
        // do nothing with text, cdata 
        break; 
       case XML_COMMENT_NODE: 
        // ensure comments to remove - sign also follows the w3c guideline 
        $nodeChild->nodeValue = str_replace("-","_",$nodeChild->nodeValue); 
        break; 
       case XML_DOCUMENT_TYPE_NODE: // 10: needs to be removed 
       case XML_PI_NODE: // 7: remove PI 
        $node->removeChild($nodeChild); 
        $nodeChild = null; // make null to test later 
        break; 
       case XML_DOCUMENT_NODE: 
        // should not appear as it's always the root, just to be complete 
        // however generate exception! 
       case XML_HTML_DOCUMENT_NODE: 
        // should not appear as it's always the root, just to be complete 
        // however generate exception! 
       default: 
        throw new exception("Engine: reworkDom type not declared [".$nodeChild->nodeType. "]"); 
      } 
      $nodeChild = $nodeNextChild; 
     } ; 
    } 

Bây giờ điều này cũng cho phép thêm nhiều phần html vào một XML mà tôi cần sử dụng. Nói chung nó có thể được sử dụng như thế này:

 $c='<p>test<font>two</p>'; 
    $dom=new DOMDocument('1.0', 'UTF-8'); 

$n=$dom->appendChild($dom->createElement('info')); // make a root element 

if($valueXml=tryToXml($dom,$c)) { 
    $n->appendChild($valueXml); 
} 
    echo '<pre/>'. htmlentities($dom->saveXml($n)). '</pre>'; 

Trong ví dụ này '<p>test<font>two</p>' độc đáo sẽ được outputed trong XML cũng được hình thành như '<info><p>test<font>two</font></p></info>'. Thẻ gốc của thông tin được thêm vào vì nó cũng sẽ cho phép chuyển đổi '<p>one</p><p>two</p>' không phải là XML vì nó không có một phần tử gốc. Tuy nhiên, nếu html của bạn chắc chắn có một phần tử gốc thì có thể bỏ qua thêm thẻ gốc <info>.

Với điều này, tôi nhận được XML thực sự tốt đẹp từ HTML không có cấu trúc và thậm chí bị hỏng!

Tôi hy vọng nó hơi rõ ràng và có thể đóng góp cho người khác sử dụng nó.

+1

Đây có phải là mã PHP không? –