2012-06-30 12 views
5

से मूल्य पढ़ें मैं एक्सएमएल/एचटीएमएल-पार्सिंग के लिए नया हूं। डुप्लिकेट के लिए उचित खोज करने के लिए सही शब्दों को भी न जानें।एचटीएमएल नोड

<body id="s1" style="s1"> 
    <div xml:lang="uk"> 
     <p begin="00:00:00" end="00:00:29"> 
      <span fontFamily="SchoolHouse Cursive B" fontSize="18">I'm great!</span> 
     </p> 

अब मैं 00:00:00, 00:00:29 और I'm great! इसे से की जरूरत है:

मैं इस HTML फ़ाइल जो इस तरह दिखता है। मैं इसे इस तरह पढ़ सकता है:

XmlTextReader reader = new XmlTextReader(file); 
while (reader.Read()) 
{ 
    if (reader.NodeType != XmlNodeType.Element) 
     continue; 

    if (reader.LocalName != "p") 
     continue; 

    var a = reader.GetAttribute(0); 
    var b = reader.GetAttribute(1); 

    if (reader.LocalName == "span") 
    { 
     XmlDocument doc = new XmlDocument(); 
     doc.Load(reader); 
     XmlNode elem = doc.DocumentElement.FirstChild; 
     var c = elem.InnerText; 
    } 
} 

मैं चर a, b और c में मान मिलता है। लेकिन एचटीएमएल प्रारूप में थोड़ा बदलाव आया था। अब एचटीएमएल इस तरह दिखता है:

<body id="s1" style="s1"> 
    <div xml:lang="uk"> 
     <p begin="00:00:00" end="00:00:29">I'm great! </p> 

इस परिदृश्य मैं कैसे बाहर पार्स करते 00:00:00, 00:00:29 और I'm great! में? मैं इस की कोशिश की:

XmlTextReader reader = new XmlTextReader(file); 
while (reader.Read()) 
{ 
    if (reader.NodeType != XmlNodeType.Element) 
     continue; 

    if (reader.LocalName != "p") 
     continue; 

    var a = reader.GetAttribute(0); 
    var b = reader.GetAttribute(1); 

    XmlDocument doc = new XmlDocument(); 
    doc.Load(reader); 
    XmlNode elem = doc.DocumentElement.FirstChild; 
    var c = elem.InnerText; 
} 

लेकिन मैं इस त्रुटि मिलती है: लाइन doc.Load(reader) पर This document already has a 'DocumentElement' node.। सही तरीके से कैसे पढ़ा जाए और परेशानी का कारण क्या हो रहा है? मैं .NET 2.0

+2

[html agility pack] (https://htmlagilitypack.codeplex.com/) पर एक नज़र डालें, ऐसा लगता है कि आपको HTML को पार्स करने की आवश्यकता है। – oleksii

+2

एचटीएमएल! = एक्सएमएल .... –

+0

@oleksii क्या मुझे वास्तव में सिस्टम.एक्सएमएल के तहत बहुत कुछ होने पर तीसरे पक्ष के lib का उपयोग करना चाहिए? इसके अलावा मैं एचटीएमएल – nawfal

उत्तर

6

का उपयोग कर रहा हूं ऐसा लगता है कि आपके पास HTML है जिसे आप एक्सएमएल पार्सर के साथ पार्स करना चाहते हैं। यह भी कारण हो सकता है कि आपको This document already has a 'DocumentElement' node. अपवाद क्यों मिलता है: क्योंकि आपके पास एक से अधिक रूट नोड हैं, जिन्हें HTML में अनुमति दी गई है (या बेहतर: सहनशील), लेकिन एक्सएमएल नहीं।

इसके बजाय एक HTML पार्सर का उपयोग करें। दुर्भाग्य से .NET ढांचे के भीतर अंतर्निहित कुछ भी नहीं है। इसके लिए आपको तीसरी पार्टी लाइब्रेरी लेनी होगी। एक बहुत अच्छा HTML agility pack है, जो ओलेक्सि ने पहले ही अपनी टिप्पणी में उल्लेख किया है।

संपादित करें:

अपनी टिप्पणी से, मैं इस तथ्य HTML और XML के बीच कोई सीधा संबंध है कि वहाँ के साथ अपने परिचित नहीं महसूस कर रही हो। ग्राफिक here से लिया काफी अच्छी तरह से इस दिखाता है:

Relation between SGML, HTML and XML

न तो एक्सएमएल एचटीएमएल का एक सबसेट, और न ही दूसरी तरह के आसपास है। केवल तभी यदि आपके पास सख्त एक्सएचटीएमएल (शायद ही मामला है), तो आपके पास एक HTML दस्तावेज़ है जिसे एक्सएमएल पार्सर के साथ पार्स किया जा सकता है। लेकिन इस तरह के एक्सएचटीएमएल दस्तावेज़ के कोड में कुछ गलती है, तो पता चलेगा, पार्सर असफल हो जाएगा, जबकि एक आम ब्राउज़र पृष्ठ प्रदर्शित करना जारी रखेगा। उन सभी नुकसान से बचने के लिए आसान सड़क लेने के लिए और एक HTML पार्सर के लिए जाना: इसके अलावा, एक्सएचटीएमएल के भविष्य है कि एचटीएमएल 5 जीवन के लिए धीरे-धीरे लेकिन लगातार आ रहा है ...

सारांश में काफी स्पष्ट नहीं है, अब।

+0

जैसा लगता है। .NET XML कक्षाओं का उपयोग करके पार्स करने के लिए कुछ भी नहीं किया जा सकता है? – nawfal

+0

नहीं, दुर्भाग्य से नहीं। एचटीएमएल एक्सएमएल का सबसेट नहीं है। इसके अलावा, एचटीएमएल पार्सर्स (ब्राउजर में भी इस्तेमाल किए गए) के कारण * अमान्य इनपुट को पार्स करने के लिए * अधिक * अधिक सहिष्णु होने के कारण, लोगों ने वेबसाइटों के लिए अमान्य HTML लिखना शुरू किया या सिर्फ वैधता की परवाह नहीं की। हालांकि, एक्सएमएल पार्सर्स * सख्ती से वैध * इनपुट की अपेक्षा करते हैं, यदि नहीं, तो वे पार्सिंग छोड़ देते हैं और जैसे ही आपने देखा है अपवाद फेंक देते हैं। –

+0

धन्यवाद फिलिप, मैं – nawfal

3

चूंकि आप HTML को पार्स करना चाहते हैं, तो आप पेज लोड करने के लिए WebClient (या WebBrowser) का उपयोग कर सकते हैं और उसके बाद नेविगेट करने के लिए HTML DOM का उपयोग कर सकते हैं। , खुली हुई टैग फिक्सिंग (जैसे < बीआर>) -

string html; 
    WebClient webClient = new WebClient(); 
    using (Stream stream = webClient.OpenRead(new Uri("http://www.google.com"))) 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
    html = reader.ReadToEnd(); 
    } 
    IHTMLDocument2 doc = (IHTMLDocument2)new HTMLDocument(); 
    doc.write(html); 
    foreach (IHTMLElement el in doc.all) 
    Console.WriteLine(el.tagName); 

मैं एक्सएमएल में HTML लोड हो रहा है की कोशिश की है से पहले, और अपने सभी बहुत कठिन: आप निम्नलिखित कोड उदाहरण के लिए Microsoft HTML Object Library (COM) के लिए एक संदर्भ जोड़ने की जरूरत गुणों के चारों ओर उद्धरण डालने, मूल्यों के बिना गुणों को मूल्य प्रदान करना आदि।चूंकि मैं इसके बाद एक्सएसएलटी का उपयोग करना चाहता था, एचटीएमएल डोम में लोड करने के बाद और प्रत्येक एचटीएमएल नोड के लिए प्रासंगिक एक्सएमएल नोड बनाने के माध्यम से नेविगेट किया। तब मेरे पास HTML का उचित XML प्रतिनिधित्व था।

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