2010-09-30 60 views
1

我在iPhone應用程序中使用xpath和LibXML來查找xml文檔中的某些節點。我是xpath的noob,所以我可能做錯了什麼。 下面是XML:LibXML找不到我的xpath表達式的任何節點


<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <GetUserByEmailResponse xmlns="http://tempuri.org/"> 
     <GetUserByEmailResult> 
     <id>4006</id> 
     <name>Kudor Gyozo</name> 
     <email/> 
     <image/> 
     <facebookId>0</facebookId> 
     </GetUserByEmailResult> 
    </GetUserByEmailResponse> 
    </soap:Body> 
</soap:Envelope> 

XPath表達式是//GetUserByEmailResult。沒有節點返回。我期待回到<GetUserByEmailResult>。如果我測試相同的東西here它工作正常。

UPDATE1:這是我從.net web服務返回的內容。有沒有辦法忽略libxml中的命名空間?

回答

2

GetUserByEmailResult元素在http://tempuri.org/命名空間,所以你需要該命名空間添加到您的XPath搜索。

你可以這樣做,使用xmlXPathRegisterNs功能:

xmlXPathRegisterNs(context, BAD_CAST "temp", BAD_CAST "http://tempuri.org/"); 

那麼你的XPath將不得不改爲

//temp:GetUserByEmailResult 
+0

是這個工程非常感謝。順便說一句,有沒有辦法忽略命名空間? – 2010-10-01 05:59:15

+0

@kudor gyozo:是的,您可以忽略命名空間,只需按照Wrikken的回答中的建議檢查XPath表達式中的本地名稱即可。 – 2010-10-01 12:32:58

3

我對iphone庫不太熟悉,但是您可能需要在某處聲明namsepace /前綴:如果您使用'someprefix'註冊'http://tempuri.org/',則可以搜索:

//someprefix:GetUserByEmailResult 

可能的解決方法是(但不建議):

//*[local-name()='GetUserByEmailResult']