2012-01-13 2 views
1

Я пишу пользовательский сервер WebDAV на C#. Одна из клиентских тестовых программ, которые я использую, - NetDrive, и она утверждает, что она является клиентом, совместимым с WebDAV. Моя проблема в том, я получаю запрос на сервер в следующем формате:Как обрабатывать XML-запрос сервера webdav в C#

<?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); 

Но я 'm не получает узлов в моем итераторе для первого файла 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

Вы используете неправильное пространство имен в своем коде. Неоднозначно спецификации WebDAV используют «DAV:» как пространство имен для узлов и атрибутов WebDAV (это, по-видимому, вызвано пропуском механизма пространства имен XML).

Смежные вопросы