Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C语言中处理webdav服务器XML请求#_C#_Xml_Xml Namespaces_Webdav - Fatal编程技术网

C# 如何在C语言中处理webdav服务器XML请求#

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文件,我的迭代器中没有节点。似乎默认名称空间没有像我认为的那样工作 我做错了什

我正在用C#编写一个自定义WebDAV服务器。我正在使用的一个客户端测试程序是,它声称并似乎是一个符合WebDAV的客户端。我的问题是,我正在服务器上接收以下格式的请求:

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