无法从Davical日历XML中获取calendar-data的技术求助
解决XML中带命名空间的
<C:calendar-data>标签获取问题 你遇到的核心问题是XML命名空间导致的——<C:calendar-data>标签带有前缀C:,这表示它属于特定的CalDAV命名空间,而普通的属性访问方式(比如你用的$item->propstat->prop->getatag)只能识别无命名空间的标签。
为什么普通标签能正常获取?
像<getcontenttype>、<getetag>这类标签没有命名空间前缀,属于默认的无命名空间范围,所以直接通过对象属性访问就能拿到内容。但<C:calendar-data>的C:前缀绑定了CalDAV的标准命名空间(URI通常是urn:ietf:params:xml:ns:caldav),必须显式处理这个命名空间才能获取到它的内容。
两种可行的解决方法
假设你用的是PHP的SimpleXML(从代码风格来看大概率是),可以用以下两种方式处理:
方法1:使用XPath查询(推荐)
先注册命名空间,再通过XPath定位标签:
// 注册CalDAV命名空间,前缀C对应标准URI $item->registerXPathNamespace('C', 'urn:ietf:params:xml:ns:caldav'); // 执行XPath查询,获取所有C:calendar-data元素 $calendarDataNodes = $item->xpath('//propstat/prop/C:calendar-data'); // 检查结果并输出内容 if (!empty($calendarDataNodes)) { echo trim($calendarDataNodes[0]); }
方法2:使用children()方法指定命名空间
直接定位到<prop>节点后,获取对应命名空间下的子元素:
// 先拿到prop节点 $propNode = $item->propstat->prop; // 获取C命名空间下的calendar-data元素(传入命名空间URI) $calendarData = $propNode->children('urn:ietf:params:xml:ns:caldav')->{'calendar-data'}; // 输出内容 echo trim($calendarData);
注意事项
- 确保命名空间URI是
urn:ietf:params:xml:ns:caldav,这是CalDAV协议规定的标准命名空间,绝大多数CalDAV服务器都会遵循这个规范。 - 如果输出的日历数据有多余的空格,可以用
trim()来清理格式。
内容的提问来源于stack exchange,提问作者inuryyev
相关产品推荐
相关产品推荐

