2011-06-26 63 views
2

如果在文檔中定義了XMLNS屬性,那麼我的XPath查詢不起作用。我發現這可能是因爲所有元素都使用默認的XMLNS,而我的XPath則不是。但是,我無法在NSXML(用於描述和解析XML文檔的常見Objective C類族)中找到任何合適的方法來解決該問題。NSXML添加命名空間以使XPath查詢起作用

例如,如果data不包含XMLNS,則以下代碼正常工作。如何讓代碼正常工作?

NSXMLDocument *xml = [[NSXMLDocument alloc] initWithData:data options:0 error:&error]; 
NSArray *result = [xml nodesForXPath:@"/parent/child" error:&error]; 
+0

XPath具有名稱空間支持。你嘗試過使用它嗎? – jtbandes

+0

聽起來很有希望,但是如何將名稱空間添加到我的XPath? – nip3o

+0

也許我錯了,它並沒有完全內置到XPath中。但NSXML *支持:http://cocoa-simple.blogspot.com/2006/06/nsxmlnode-and-xpath-and-namespaces.html – jtbandes

回答

1

我剛剛花了一些時間處理類似問題(Google的KML文件)。您的問題可能是由於命名空間問題。當您設置命名空間映射時,爲命名空間提供一個鍵,然後在您的XPath表達式中使用該鍵後跟一個冒號(:)來爲您的選擇器添加前綴。該解決方案使用整潔的TouchXML library中的CXMLDocuments和CXMLElements。

要開始一個簡單的例子,說你的XML是:

<books xmlns="http://what.com/ever"> 
    <book> 
    <title>Life of Pi</title> 
    </book> 
    <book> 
    <title>Crime and Punishment</book> 
    </book 
</books> 

你會選擇所有的書:

// So, assuming you've already got the data for the XML document 
CXMLDocument* xmldoc = [[CXMLDocument alloc] initWithData:xmlDocData options:0 error:nil]; 
NSDictionary *namespaceMappings = [NSDictionary dictionaryWithObjectsAndKeys:@"http://what.com/ever", @"nskey", nil]; 
NSError *error = nil; 
NSArray *bookElements = [xmldoc nodesForXPath:@"/nskey:books/nskey:book" namespaceMappings:mappings error:&error]; 

請注意,您需要前綴的每一個元素,而不僅僅是一個聲明名字空間的地方。