2008-10-08 13 views
19

मेरे पास एक प्रोजेक्ट है जहां मैं कुछ विशेष रूप से बदसूरत "लाइव" एचटीएमएल ले रहा हूं और इसे एचटीएमएल एजिलिटी पैक के साथ एक औपचारिक एक्सएमएल डोम में मजबूर कर रहा हूं। मैं जो करने में सक्षम होना चाहता हूं, उसके बाद लिंक से एक्सएमएल के साथ इस पर सवाल पूछता हूं ताकि मैं जिस बिट्स की ज़रूरत हो, उसे बाहर निकाल सकूं। मैं HtmlDocument को XDocument में पार्स करने के लिए here वर्णित विधि का उपयोग कर रहा हूं, लेकिन इस पर क्वेरी करने का प्रयास करते समय मुझे यकीन नहीं है कि नामस्थान कैसे प्रबंधित करें। एक विशेष दस्तावेज़ में मूल HTML वास्तव में खराब निम्नलिखित टैग के साथ एक्सएचटीएमएल स्वरूपित किया गया था:लिंक से एक्सएमएल पर पूछताछ करते समय आप मनमाने ढंग से नेमस्पेस कैसे प्रबंधित करते हैं?

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 

जब इस दस्तावेज़ ऐसा लगता है कि नाम स्थान विशेषता मेरे जैसे कुछ करने से रोक रहा है से क्वेरी करने के लिए कोशिश कर रहा है:

var x = xDoc.Descendants("div"); 
// returns null 

स्पष्ट रूप से उन "div" टैग के लिए केवल स्थानीय नाम "div" है, लेकिन उचित टैग नाम नामस्थान प्लस "div" है। मैं एक्सएमएल नामस्थान के मुद्दे पर कुछ शोध करने की कोशिश की है और ऐसा लगता है कि मैं इस तरह से पूछताछ की नाम स्थान बायपास कर सकते हैं:

var x = 
    (from x in xDoc.Descendants() 
    where x.Name.LocalName == "div" 
    select x); 
// works 

बहरहाल, यह एक नहीं बल्कि hacky समाधान की तरह लगता है और ठीक से नाम स्थान को संबोधित नहीं करता मुद्दा। जैसा कि मैं समझता हूं कि एक उचित एक्सएमएल दस्तावेज़ में कई नामस्थान हो सकते हैं और इसलिए इसे संभालने का उचित तरीका उन नामस्थानों को पार्स करना है जिन्हें मैं पूछताछ कर रहा हूं। क्या किसी और को कभी ऐसा करना पड़ा है? क्या मैं इसे जटिल बनाने का रास्ता बना रहा हूं? मुझे पता है कि मैं एचटीएमएल दस्तावेज़ के साथ चिपके हुए और XPath के साथ पूछताछ करके इन सब से बच सकता हूं, लेकिन यदि संभव हो तो मैं जो भी जानता हूं (लिंक) के साथ रहूंगा और मैं यह भी जानना चाहूंगा कि मैं आगे नामस्थान के लिए खुद को स्थापित नहीं कर रहा हूं- सड़क से संबंधित मुद्दों।

इस स्थिति में नामस्थानों से निपटने का सही तरीका क्या है?

उत्तर

17

LocalName का उपयोग ठीक होना चाहिए। मैं इसे एक हैक सब पर विचार करेगा नहीं करता है, तो आप परवाह नहीं है क्या नाम स्थान क्या है

आप नाम स्थान आप चाहते हैं पता है और आप इसे निर्दिष्ट करने के लिए चाहते हैं, तो आप कर सकते हैं:।

var ns = "{http://www.w3.org/1999/xhtml}"; 
var x = xDoc.Root.Descendants(ns + "div"); 

(MSDN reference)

तुम भी सभी दस्तावेज़ में उपयोग नामस्थान की एक सूची प्राप्त कर सकते हैं:

var namespaces = (from x in xDoc.Root.DescendantsAndSelf() 
        select x.Name.Namespace).Distinct(); 

मैं तुम्हें इस्तेमाल कर सकते हैं कि ऐसा करने के लिए लगता है लेकिन यह वास्तव में से किसी भी कम नहीं है हैक:

var x = namespaces.SelectMany(ns=>xDoc.Root.Descendants(ns+"div")); 
+9

XLINQ API :(के बारे में यह सबसे कष्टप्रद बात है। नामस्थानों को अनदेखा करने के लिए बस इसे बताने के लिए एक तरीका होना अच्छा होगा, या कम से कम एक डिफ़ॉल्ट निर्दिष्ट करें। – MichaelGG

-11

मुझे लगता है कि अपने Google फू आप विफल रहता है:

http://www.google.com.au/search?hl=en&q=linq+xml+namespaces

+5

नहीं। मुझे उन शीर्ष दस लिंकों में से एक में वास्तविक दुनिया का उदाहरण दिखाएं जो ऐसी परिस्थिति का वर्णन करता है जहां आप पहले से ही नामस्थान नहीं जानते हैं। – bouvard

2

आप जानते हैं कि नामस्पेस, XML के मूल तत्व द्वारा घोषित किया जा रहा है के रूप में सबसे है अक्सर मामला, आप यह कर सकते हैं:

var ns = xDoc.Root.Name.Namespace; 
var x = xDoc.Descendants(ns + "div"); 
संबंधित मुद्दे

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