2011-08-12 15 views
5

का उपयोग करके मैं XHTML दस्तावेज़ को TouchXML के माध्यम से पार्स करने का प्रयास कर रहा हूं, लेकिन यह हमेशा XPath query के माध्यम से कोई टैग नहीं ढूंढ सकता है।क्या यह XPath क्वेरी एक्सएचटीएमएल गलत पार्स करने पर है? TouchXML

नीचे एक्सएचटीएमएल है:

XHTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <meta name="generator" content= 
     "HTML Tidy for Mac OS X (vers 25 March 2009), see www.w3.org" /> 
     <title></title> 
     </head> 
    <body> 
     <p> 
      <a href="http://www.flickr.com/photos/[email protected]/5987335786/" 
      title="casavermeer5.jpg by the style files, on Flickr"> 
      <img src="http://farm7.static.flickr.com/6127/5987335786_abec990554_o.jpg" 
       width="500" height="750" border="0" alt="casavermeer5.jpg" /> 
      </a> 
     </p> 
    </body> 
</html> 

तो, हम एक "पी" टैग, "एक" टैग और "img" टैग

क्या मैं तो के रूप में दिखाया गया है था कि देखते हैं देख सकते हैं नीचे दिए गए कोड:

CXHTMLDocument *doc = [[[CXHTMLDocument alloc] initWithXHTMLString:XHTML options:0 error:&error] autorelease]; 
NSLog(@"error %@", [error localizedDescription]); 
NSLog(@"doc children count = %d", [doc childCount]); 
NSArray *imgNodeArray = [doc nodesForXPath:@"//img" error:&error]; 
NSLog(@"imgNodeArray = %d", [imgNodeArray count]); 
NSLog(@"error %@", [error localizedDescription]); 

परिणाम

error (null) 
doc children count = 2 
imgNodeArray = 0 
error (null) 
हैं 210

तो, XHTML दस्तावेज़ को पार्स करने में कोई त्रुटि नहीं है और XPath query के लिए कोई त्रुटि नहीं है। इसके अलावा इस दस्तावेज़ में रूट के नीचे दो बच्चे हैं ("बॉडी" टैग और "हेड" टैग)। लेकिन समस्या यह है कि यह "img" टैग नहीं ढूंढ सकता है। मैंने अन्य संभावित टैग नामों (जैसे पी, ए, यहां तक ​​कि शरीर, सिर) के साथ "आईएमजी" को प्रतिस्थापित करने की कोशिश की है, कोई भाग्य नहीं है।

क्या कोई मेरी मदद कर सकता है?

पीएस

वास्तव में मूल दस्तावेज़ एक HTML है, मैंने HTML को एक्सएचटीएमएल में पहले साफ करने के लिए TouchXML lib में सीटीडी क्लास का उपयोग किया है। ऊपर एक्सएचटीएमएल उस सीटीडी परिणामों से आया था।

मैं भी कोई भाग्य

NSArray *imgNodeArray = [doc nodesForXPath:@"//xhtml:img" namespaceMappings:namespaceDict error:&error]; 

फिर भी करने के लिए XPath क्वेरी करने के लिए एक नाम स्थान बात को जोड़ने के लिए, इस

NSMutableDictionary *namespaceDict = [NSMutableDictionary dictionary]; 
[namespaceDict setValue:@"http://www.w3.org/1999/xhtml" forKey:@"xhtml"]; 

की तरह और बदल XPath क्वेरी, कोई भी परिणाम नहीं मिल सकता है की कोशिश की।

+0

यदि आप क्रोम ब्राउज़र में xhtml लोड करते हैं और // img xpath दर्ज करते हैं, तो img टैग स्थित है।आपके XPath एक्सप्रेशन के साथ कुछ भी गलत नहीं है - क्या यह हो सकता है कि आपकी लाइब्रेरी // शॉर्टकट को समझ न सके?/वंशज :: img का उपयोग करने का प्रयास करें और देखें कि तब क्या होता है। – drew

+0

@ ड्रू की टिप्पणी के बाद, एक पूर्ण XPath का उपयोग करने का प्रयास करें यह देखने के लिए कि क्या आपकी लाइब्रेरी _any_ Xpath का पालन कर सकती है, उदाहरण के लिए। '/ Html/शरीर/पी/img'। फिर उन पथों को आजमाएं जो आपको करीब लेते हैं, उदाहरण के लिए। '/ html // img' जैसा कि उन्होंने Xpath _is_ मान्य कहा था, इसलिए इसे काम करना चाहिए, और ऑक्सीजनएक्सएमएल में परीक्षण करते समय किया जाता है। –

उत्तर

0

इस //img आज़माएं। जब आप // का उपयोग करते हैं तो यह img टैग प्राप्त करता है, इससे कोई फर्क नहीं पड़ता कि यह पृष्ठ में कहां है।
यह //xhtml:img से बेहतर है - क्योंकि कभी-कभी पदानुक्रम टैग पीछे कोड में थोड़ा सा बदल जाता है, इसलिए यह वैश्विक होना बेहतर है, और बहुत अधिक विशिष्ट नहीं है।

0

मुझे आपकी मदद करने में एक बार ऐसी ही समस्या थी। मेरे पास एक दस्तावेज़ था जिसे मैं पार्स करूँगा और कुछ स्थलों को ढूंढूंगा और अपने XPaths रिकॉर्ड करूँगा। फिर, मैं दस्तावेज़ को UIWebView में लोड करूंगा और उन तत्वों पर क्रियाएं करने के लिए जावास्क्रिप्ट चलाऊंगा जिन्हें मैंने पहले चिह्नित किया था। समस्याग्रस्त रूप से, दस्तावेज़ को पार्स करने के बाद डीओएम संरचना पूरी तरह से अलग थी और मेरे सभी XPaths अमान्य थे। तालिकाओं से संबंधित एक विशेष मामला।

<table> 
    <tr> 
     <td>Cell</td> 
    </tr> 
</table> 

उपरोक्त सरल HTML हमेशा नीचे की तरह कुछ रूपांतरित हो जाएगा। (सफेद स्थान केवल पठनीयता के लिए है और मैं स्मृति से जा रहा हूँ।)

<table> 
    <thead></thead> 
    <tbody> 
     <tr> 
      <td>Cell</td> 
     </tr> 
    </tbody> 
</table> 

इस के साथ मेरी बात अपने पार्सर अपने HTML संरचना में इंजेक्शन तत्वों हो सकता है।