2012-05-06 4 views
12

में कनवर्ट करना मुझे एचटीएमएल फाइलों में घूमने की जरूरत है जिसे एक्सएमएल में कन्फेट करने की आवश्यकता है। हम इन HTML का उपयोग अनुप्रयोगों के लिए सामग्री की सेवा के लिए कर रहे हैं लेकिन अब हमें इन सामग्रियों को एक्सएमएल के रूप में सेवा देना है।एचटीएमएल को एक्सएमएल

HTML फ़ाइलों .. होता है, टेबल, div के, छवि के, पी के, ख या मजबूत टैग, आदि कर रहे हैं

मैं googled और कुछ अनुप्रयोगों पाया, लेकिन मैं अभी तक हासिल नहीं कर सका।

क्या आप इन फ़ाइल सामग्रियों को XML में परिवर्तित करने का कोई तरीका सुझा सकते हैं?

+0

[इस पोस्ट] पर एक नज़र डालें (http://stackoverflow.com/a/85922/938089)। फिर, [चौथी टिप्पणी] पर एक बहुत नजदीक देखो (http://stackoverflow.com/questions/84556/#comment1436887_85922)। आप HTML को XML में क्यों परिवर्तित करना चाहते हैं? –

+0

@RobW मैं इसे देख लूंगा। हम कुछ अनुप्रयोगों के लिए सामग्री के रूप में एचटीएमएल की सेवा कर रहे थे लेकिन अब हमें एक्सएमएल के रूप में काम करना है। –

+0

@RobW, मैं एक्सएमएल और एचटीएमएल के बीच अंतर भी जानता हूं। लेकिन मुझे इसकी सामग्री को पार्स करने और एक्सएमएल में डालने की जरूरत है। –

उत्तर

15

मैं tidy कमांड लाइन उपयोगिता का उपयोग सफल रहा था। लिनक्स पर मैंने इसे apt-get install tidy के साथ जल्दी से स्थापित किया। फिर आदेश:

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

एक xml फ़ाइल है, जो मैं xslt प्रोसेसर के साथ प्रोसेस करने में सक्षम था दे दी है। हालांकि मुझे xhtml1 dtds को सही ढंग से स्थापित करने की आवश्यकता थी। html-tidy.org (और विरासत एक: HTML Tidy)

+4

xmllint -html -xmlout –

+2

भी है, मैं कभी-कभी इसका उपयोग भी करता हूं। मुझे लगता है कि आपको इससे अलग जवाब देना चाहिए। – Jarekczek

+0

क्या यह HTML फ़ाइल से जावास्क्रिप्ट को हटाता है – Alaa

1

याद रखें कि HTML और XML मार्कअप भाषाओं के पेड़ में दो अलग-अलग अवधारणाएं हैं। आप बिल्कुल replace HTML with XML नहीं कर सकते हैं। एक्सएमएल को एचटीएमएल के सामान्यीकृत रूप के रूप में देखा जा सकता है, लेकिन यहां तक ​​कि यह अपरिचित है। आप मुख्य रूप से डेटा प्रदर्शित करने के लिए एचटीएमएल का उपयोग करते हैं, और डेटा को ले जाने (या स्टोर) करने के लिए एक्सएमएल का उपयोग करते हैं।

यह लिंक उपयोगी है: How to read HTML as XML?

More here - difference between HTML and XML

+0

HTML __is__ XML। – bfontaine

+10

@boudou। नहीं, एक्सएचटीएमएल एक्सएमएल है, एचटीएमएल नहीं है। – Bruno

+1

तो आप क्या सुझाव देते हैं? अगर मैं पहली बार एचटीएमएल को एक्सएचटीएमएल में परिवर्तित करता हूं तो क्या मैं आसानी से एक्सएमएल में परिवर्तित कर सकता हूं? –

2

मैं एक रास्ता मिल गया था कन्वर्ट करने के लिए (यहां तक ​​कि बुरा) एचटीएमएल अच्छी तरह से गठित XML में

यह उनकी मुख्य पृष्ठ है। मैंने इसे डीओएम लोडएचटीएमएल फ़ंक्शन पर आधार देना शुरू कर दिया। हालांकि समय के दौरान कई मुद्दे सामने आए और मैंने साइड इफेक्ट्स को सही करने के लिए पैच को अनुकूलित और जोड़ा।

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

अब यह भी एक एक्सएमएल जो मैं अपने आप को उपयोग करने के लिए की जरूरत में और अधिक एचटीएमएल टुकड़े जोड़ने के लिए अनुमति देता है। सामान्य तौर पर इसे इस तरह इस्तेमाल किया जा सकता:

 $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>'; 

इस उदाहरण '<p>test<font>two</p>' में अच्छी तरह से 'के रूप में <info><p>test<font>two</font></p></info>' अच्छी तरह से गठित XML में outputed कर दिया जाएगा। जानकारी रूट टैग जोड़ा जाता है क्योंकि यह '<p>one</p><p>two</p>' को परिवर्तित करने की अनुमति भी देगा जो एक्सएमएल नहीं है क्योंकि इसमें एक मूल तत्व नहीं है। हालांकि अगर आप निश्चित रूप से एचटीएमएल एक रूट तत्व रखते हैं तो अतिरिक्त रूट <info> टैग छोड़ा जा सकता है।

इसके साथ मुझे असंगठित और यहां तक ​​कि भ्रष्ट HTML से वास्तविक अच्छा एक्सएमएल मिल रहा है!

मुझे उम्मीद है कि यह थोड़ा स्पष्ट है और अन्य लोगों को इसका उपयोग करने में योगदान दे सकता है।

+1

क्या यह PHP कोड है? –

संबंधित मुद्दे