2012-01-13 86 views
1

我正在用C#編寫一個自定義的WebDAV服務器。我使用的客戶端測試程序之一是NetDrive,它聲稱並且似乎是符合WebDAV的客戶端。我的問題是,我在下面的格式。在接收服務器上的請求:如何在C#中處理webdav服務器XML請求#

<?xml version="1.0" encoding="utf-8"?> 
<propfind xmlns="DAV:"> 
    <allprop/> 
</propfind> 

但其他客戶做到這一點:

<?xml version="1.0" encoding="utf-8"?> 
<D:propfind xmlns:D="DAV:"> 
    <D:allprop/> 
</D:propfind> 

兩個不同的命名空間形式繼續fooing我的邏輯去尋找「allprop」元素。我的代碼看起來有點像這樣:

string xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><propfind xmlns=\"DAV:\"><allprop/></propfind>"; //Hardcode to make all the StackOverflow users' lives easier 
XPathDocument doc = new XPathDocument(new StringReader(xml)); 
XPathNavigator nav = doc.CreateNavigator(); 
XPathNodeIterator it = nav.Select("/propfind/*"); 

現在,我知道我需要把某種類型的命名空間管理,爲「DAV:」所以我嘗試這樣做:

XmlNamespaceManager nsman = new XmlNamespaceManager(nav.NameTable); 
nsman.AddNamespace("", "DAV"); 
XPathNodeIterator it = nav.Select("/propfind/*", nsman); 

但我在我的迭代器中沒有爲第一個XML文件獲取節點。看起來默認的命名空間並不像我認爲的那樣工作。

我在做什麼錯?當命名空間可能是默認的,或者可能被顯式命名時,如何查詢此XML是否存在allprop節點?

回答

0

我結束了尋找命名空間URI(DAV :)並添加它,如果它不存在。然後,我只做了一個命名空間合格的SELECT,它在我所有的測試用例中都能正常工作:

XPathDocument document = new XPathDocument(xml); 
XPathNavigator navigator = document.CreateNavigator(); 

//Get namespaces & add them to the search 
bool hasDAV = false; 
string davPrefix = "D"; 
XmlNamespaceManager nsman = new XmlNamespaceManager(navigator.NameTable); 

foreach (KeyValuePair<string, string> nskvp in navigator.GetNamespacesInScope(XmlNamespaceScope.All)) 
{ 
    if (string.Compare(nskvp.Value, "DAV:", StringComparison.InvariantCultureIgnoreCase) == 0) 
    { 
     hasDAV = true; 
     davPrefix = nskvp.Key; 
    } 
    nsman.AddNamespace(nskvp.Key, nskvp.Value); 
} 

if (!hasDAV) 
    nsman.AddNamespace(davPrefix , "DAV:"); 


XPathNodeIterator iterator = navigator.Select("/" + davPrefix + ":" + WebDavXML.PropFind + "/*", nsman); 
1

您的代碼中使用了錯誤的名稱空間。 Unforunalely WebDAV規範使用 'DAV:'作爲WebDAV節點和屬性的名稱空間(這似乎是由於對XML名稱空間機制的誤解造成的)。

相關問題