要在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代碼中正確理解。
'NSArray'是Apple的Cocoa和Cocoa Touch框架中的標準數組/列表類。 – 2012-02-22 18:26:03
@Josh Caswell,謝謝,很高興知道。 – 2012-02-22 18:27:49