2014-01-16 105 views
1

我有一個客戶端應用程序,用於解析從2個不同服務器發送的xml響應。我稱他們爲服務器A和B.Pugixml - 帶前綴映射並且沒有前綴映射的解析名稱空間

服務器A響應與下面的響應請求之一:

<?xml version="1.0" encoding="UTF-8"?> 
    <D:multistatus xmlns:D="DAV:"> 
    <D:response> 
    <D:href>/T12.txt</D:href> 
    <D:propstat> 
    <D:prop> 
    <local-modification-time xmlns="urn:abc.com:webdrive">1389692809</local-modification-time> 
    </D:prop> 

    <D:status>HTTP/1.1 200 OK</D:status> 

    </D:propstat> 
</D:response> 
</D:multistatus> 

服務器B響應與下面的響應請求之一:

<?xml version="1.0" encoding="UTF-8"?> 
    <D:multistatus xmlns:D="DAV:"> 
    <D:response> 
    <D:href>/T12.txt</D:href> 
    <D:propstat> 
    <D:prop> 
    <O:local-modification-time xmlns:O="urn:abc.com:webdrive">1389692809</O:local-modification-time> 
    </D:prop> 

    <D:status>HTTP/1.1 200 OK</D:status> 

    </D:propstat> 
</D:response> 
</D:multistatus> 

如果你觀察兩個服務器之間的區別,serverA不會發送名稱空間和前綴之間的映射,但serverB會(看看本地修改時間標記)。我如何編寫通用客戶端解析邏輯來處理這兩種情況。任何示例代碼都會有很大的幫助。

感謝, -Sandeep

回答

3

我認爲最好的方法是不理會命名空間和找到本地名稱的節點。 您可以使用XPath像這樣做:

node.select_single_node(".[local-name()='local-modification-time']") 

或者你可以用C++這樣的:

pugi::xml_node child_by_local_name(pugi::xml_node node, const char* name) 
{ 
    for (pugi::xml_node child = node.first_child(); child; child = child.next_sibling()) 
    { 
     if (strcmp(child.name(), name) == 0) 
      return child; 

     const char* colon = strchr(child.name(), ':'); 

     if (colon && strcmp(colon + 1, name) == 0) 
      return child; 
    } 

    return pugi::xml_node(); 
} 
相關問題