Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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#X文件问题_C#_Xml_Linq To Xml - Fatal编程技术网

c#X文件问题

c#X文件问题,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我对xml解析相当陌生 以下是非常基本的教程,我尝试解析CalDav服务器返回的以下xml: <?xml version="1.0" encoding="utf-8" ?> <multistatus xmlns="DAV:"> <response> <href>/caldav.php/icalendar.ics</href> <propstat> <prop> <getetag>

我对xml解析相当陌生

以下是非常基本的教程,我尝试解析CalDav服务器返回的以下xml:

<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:">
 <response>
  <href>/caldav.php/icalendar.ics</href>
  <propstat>
   <prop>
    <getetag>"xxxx-xxxx-xxxx"</getetag>
   </prop>
   <status>HTTP/1.1 200 OK</status>
  </propstat>
 </response>
 <sync-token>data:,20</sync-token>
</multistatus>
未找到后代。我是不是遗漏了什么?我的根确实是一个“multistatus”元素,它说它有元素,但它似乎不能通过名称找到它们


任何帮助都将不胜感激

您的
响应
元素实际上位于名称空间中,这是由于根节点中的此属性:

xmlns="DAV:"
为该元素及其子体设置默认名称空间

因此,您也需要在该名称空间中搜索元素。幸运的是,LINQ to XML使这一点变得非常简单:

XNamespace ns = "DAV:";
foreach (var node in xDoc.Root.Descendants(ns + "response"))
{
    ...
}

由于根节点中的此属性,您的
响应
元素实际上位于命名空间中:

xmlns="DAV:"
为该元素及其子体设置默认名称空间

因此,您也需要在该名称空间中搜索元素。幸运的是,LINQ to XML使这一点变得非常简单:

XNamespace ns = "DAV:";
foreach (var node in xDoc.Root.Descendants(ns + "response"))
{
    ...
}

linq-to-xml功能强大且易于学习,因此值得后退一步,并进一步了解xpath甚至xslt——如果只是想更多地欣赏linq-to-xml的话。linq-to-xml功能强大且易于学习,退一步,学习更多关于xpath甚至xslt的知识是值得的——如果只是想更多地欣赏linq到xml的话。这也很有效:xDoc.Root.subjections()。其中(x=>x.Name.LocalName==“response”)@jdweng:是的,但在我看来没有那么干净。错!它更干净,因为它可以与任何ns一起工作。您的解决方案只能在名称空间为DAV的情况下工作。@jdweng:我的解决方案精确地找到了所需的元素,没有其他元素。我认为这是件好事。我喜欢明确我要找的东西。当然,如果他们愿意,OP可以将其更改为使用“根元素的名称空间”。我收到了许多人的请求,他们可以获得不同的名称空间,并且需要一个可变的解决方案。这也很有效:xDoc.root.subjects()。其中(x=>x.Name.LocalName==“response”)@jdweng:是的,但在我看来没有那么干净。错!它更干净,因为它可以与任何ns一起工作。您的解决方案只能在名称空间为DAV的情况下工作。@jdweng:我的解决方案精确地找到了所需的元素,没有其他元素。我认为这是件好事。我喜欢明确我要找的东西。当然,如果他们愿意,OP可以将其更改为使用“根元素的名称空间”。我收到许多人的请求,他们可以获得不同的名称空间,并且需要一个可变的解决方案。