C# 如何在C语言中处理webdav服务器XML请求#
我正在用C#编写一个自定义WebDAV服务器。我正在使用的一个客户端测试程序是,它声称并似乎是一个符合WebDAV的客户端。我的问题是,我正在服务器上接收以下格式的请求:C# 如何在C语言中处理webdav服务器XML请求#,c#,xml,xml-namespaces,webdav,C#,Xml,Xml Namespaces,Webdav,我正在用C#编写一个自定义WebDAV服务器。我正在使用的一个客户端测试程序是,它声称并似乎是一个符合WebDAV的客户端。我的问题是,我正在服务器上接收以下格式的请求: <?xml version="1.0" encoding="utf-8"?> <propfind xmlns="DAV:"> <allprop/> </propfind> 但是对于第一个XML文件,我的迭代器中没有节点。似乎默认名称空间没有像我认为的那样工作 我做错了什
<?xml version="1.0" encoding="utf-8"?>
<propfind xmlns="DAV:">
<allprop/>
</propfind>
但是对于第一个XML文件,我的迭代器中没有节点。似乎默认名称空间没有像我认为的那样工作
我做错了什么?当名称空间可能是默认名称,或者可能显式命名时,如何查询此XML是否存在
allprop
节点?您在代码中使用了错误的名称空间。不幸的是,WebDAV规范使用
“DAV:”作为WebDAV节点和属性的命名空间(这似乎是由
对XML名称空间机制的错误理解)。您在代码中使用了错误的名称空间。不幸的是,WebDAV规范使用 “DAV:”作为WebDAV节点和属性的命名空间(这似乎是由
对XML名称空间机制的错误理解。)我最后查找了名称空间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);
XPathDocument文件=新的XPathDocument(xml);
XPathNavigator=document.CreateNavigator();
//获取名称空间并将其添加到搜索中
bool-hasDAV=false;
字符串davPrefix=“D”;
XmlNamespaceManager nsman=新的XmlNamespaceManager(navigator.NameTable);
foreach(navigator.GetNamespacesInScope(XmlNamespaceScope.All)中的KeyValuePair nskvp)
{
if(string.Compare(nskvp.Value,“DAV:”,StringComparison.InvariantCultureIgnoreCase)==0)
{
hasDAV=真;
davPrefix=nskvp.Key;
}
AddNamespace(nskvp.Key,nskvp.Value);
}
如果(!hasDAV)
AddNamespace(DAV前缀,“DAV:”);
XPathNodeIterator iterator=navigator。选择(“/”+davPrefix+”:“+WebDavXML.PropFind+”/*”,nsman);
我最后查找了名称空间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);
XPathDocument文件=新的XPathDocument(xml);
XPathNavigator=document.CreateNavigator();
//获取名称空间并将其添加到搜索中
bool-hasDAV=false;
字符串davPrefix=“D”;
XmlNamespaceManager nsman=新的XmlNamespaceManager(navigator.NameTable);
foreach(navigator.GetNamespacesInScope(XmlNamespaceScope.All)中的KeyValuePair nskvp)
{
if(string.Compare(nskvp.Value,“DAV:”,StringComparison.InvariantCultureIgnoreCase)==0)
{
hasDAV=真;
davPrefix=nskvp.Key;
}
AddNamespace(nskvp.Key,nskvp.Value);
}
如果(!hasDAV)
AddNamespace(DAV前缀,“DAV:”);
XPathNodeIterator iterator=navigator。选择(“/”+davPrefix+”:“+WebDavXML.PropFind+”/*”,nsman);
XmlNamespaceManager nsman = new XmlNamespaceManager(nav.NameTable);
nsman.AddNamespace("", "DAV");
XPathNodeIterator it = nav.Select("/propfind/*", nsman);
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);