2012-02-22 95 views
0

我有一個這樣的XML:的XPath和XML迭代

<root> 
    ... 
    <images xmlns:a="http://.../Arrays"> 
     <a:string>http://images...233/Detail.jpg</a:string> 
     <a:string>http://images....233/Detail2.jpg</a:string> 
    </images> 
    ... 
    <images xmlns:a="http://.../Arrays"> 
     <a:string>http://images...233/Detail3.jpg</a:string> 
     <a:string>http://images....233/Detail4.jpg</a:string> 
     <a:string>http://images....233/Detail5.jpg</a:string> 
    </images> 
.... 
<images xmlns:a="http://.../Arrays"> 
     <a:string>http://images...233/Detail6.jpg</a:string> 
     <a:string>http://images....233/Detail7.jpg</a:string> 
    </images> 
    .... 
<root> 

我如何可以遍歷把我在NSArray中的所有圖像?

回答

0

我該如何迭代將所有圖像放入NSArray中?

我不知道你的意思是NSArray

通常XPath引擎會暴露像SelectNodes(string XpathExpression)這樣的方法,可能會因爲NamespaceManager對象參數超載。

而這種方法通常會返回一個XmlNodelist對象,其中包含所有結果並允許遍歷它們。

一個XPath表達式選擇包含所提供的XML文檔圖像中的所有文本節點:

<images xmlns:a="http://.../Arrays"> 
    <a:string>http://images...233/Detail.jpg</a:string> 
    <a:string>http://images....233/Detail2.jpg</a:string> 
</images> 

/*/*/text() 

這將選擇的父是任何文本節點XML文檔中頂層元素的子元素 - 在這種情況下,這些節點恰好是具有字符串值的兩個文本節點:

"http://images...233/Detail.jpg"

"http://images....233/Detail2.jpg"

+0

'NSArray'是Apple的Cocoa和Cocoa Touch框架中的標準數組/列表類。 – 2012-02-22 18:26:03

+0

@Josh Caswell,謝謝,很高興知道。 – 2012-02-22 18:27:49

0

要在iOS設備上執行此操作,最好使用爲您實現XPath評估的第三方C庫,因爲iOS提供的內置XML支持不支持。你最好的選擇是使用libxslt,但是因爲libxslt的可下載版本是以動態庫的形式出現的,所以它不能直接在iOS上使用。相反,您需要爲libxslt提取源代碼並將其直接構建到應用程序中。有關讓libxslt在iOS上工作的更多信息,請參閱this SO post

一旦你在的libxslt項目工作,你可以用C代碼來解析XML和評估任意XPath表達式,如「/ / /文()」一樣,是由@Dmitre Novatchev建議。有你如何能做到這一點很多變種,但這樣的事情給你一個例子:

CFArrayRef findImages(CFStringRef filename) { 

    xmlInitParser(); 
    LIBXML_TEST_VERSION 

    // Parse XML template document into DOM tree 
    CFIndex filenameLength = CFStringGetLength(filePath); 
    char *fileNameCString = (char *) calloc(filenameLength + 1, sizeof(char)); 
    CFStringGetCString(filePath, fileNameCString, filenameLength + 1, kCFStringEncodingUTF8); 

    xmlDocPtr doc = xmlReadFile(fileNameCString, NULL, 0); 
    if (doc == NULL) 
    { 
     // Error - File not readable 
     free(fileNameCString); 
     return nil; 
    } 
    else 
    { 
     free(fileNameCString); 
     xmlCleanupParser(); 
    } 

    /* Create xpath evaluation context */ 
    xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc); 
    if(xpathCtx == NULL) 
    { 
     // Error - Failed to create Xpath context 
     return NULL; 
    } 


    /* Evaluate xpath expression */ 
    char *xpathCString = "/*/*/text()"; 
    xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression(BAD_CAST xpathCString, xpathCtx); 
    if(xpathObj == NULL) 
    { 
     // Error - Failed to evaluate XPath 
     xmlXPathFreeContext(xpathCtx); 
     return NULL; 
    } 
    xmlNodeSetPtr resultNodes = xpathObj->nodesetval; 


    // You'll want to double-check the following part: I don't have sample code for 
    // this so I can't be certain this is 100% correct, but it gets the idea across! 

    CFMutableArrayRef result = CFArrayCreate(kCFAllocatorDefault, 0, NULL); 
    for (int i = 0; i < resultNodes->nodeNr; i++) { 
     char *imageCString = xmlNodeGetContent(resultNodes->nodeTab[i]); 
     CFStringRef imageString = CFStringCreateWithCString(kCFAllocatorDefault, imageCString, kCFStringEncodingUTF8); 
     CFArrayAppendValue(result, imageString); 
    } 

    return result; 
} 

我已經基於一些工作示例代碼我不得不評估XPath表達式把這個代碼示例在一起,但我把它組裝成一個數組的末端部分不在我的頭頂:它可能不完全正確!

請注意,此函數將CFString作爲XML文件的文件名,並返回結果的CFArray。這些類型是Objective-C NSString和NSArray類型的「免費橋接」。這意味着你可以用你習慣使用的「常規」類型從Objective-C調用它們,它們將在我提供的C代碼中正確理解。

+0

感謝您的回答。我正在使用GDataXML來解析我的XML,它工作正常,但我有一個麻煩迭代這部分我的XML? – samir 2012-02-22 19:59:15

+0

如果你已經使用過GDataXML,你能告訴我如何將所有的.png放在NSMutableArray中嗎?再次感謝 – samir 2012-02-22 20:00:53

+0

我從來沒有使用GDataXML - 但快速谷歌搜索出現http://www.raywenderlich.com/725/how-to-read-and-write-xml-documents-with-gdataxml,他們在哪裏提供一個根據文檔評估XPath表達式並將結果作爲NSArray返回的示例 – 2012-02-22 20:04:52