c#X文件问题
我对xml解析相当陌生 以下是非常基本的教程,我尝试解析CalDav服务器返回的以下xml: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 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可以将其更改为使用“根元素的名称空间”。我收到许多人的请求,他们可以获得不同的名称空间,并且需要一个可变的解决方案。