如何添加指定结构的SOAP Header?XMLWriter命名空间问题求助
解决XMLWriter构建带命名空间SOAP Header的问题
我之前也踩过XMLWriter处理命名空间的坑,其实核心是要正确注册命名空间并通过官方方法关联前缀,而不是直接硬写带前缀的元素名。针对你需要的SOAP Header结构,这里给你一套可行的实现方案,包括处理全局命名空间前缀的部分:
核心实现思路
- 先注册所有需要用到的命名空间(比如SOAP-ENV、wsu,以及你提到的
ns1这类全局前缀对应的URI) - 使用XMLWriter的
startElementNS()方法创建带前缀的元素,而不是手动拼接前缀 - 局部命名空间(比如
kontekstWywolania上的wsu)可以直接在元素上声明,或者提前注册
完整代码示例
$writer = new XMLWriter(); $writer->openMemory(); $writer->setIndent(true); $writer->setIndentString(' '); // 定义各命名空间的URI(替换成你实际的URI) $soapEnvNs = 'http://schemas.xmlsoap.org/soap/envelope/'; // SOAP-ENV标准命名空间 $wsuNs = 'http://namespace.xsd'; // 你提供的wsu命名空间 $globalNs = 'http://your-global-namespace-uri.com'; // 对应你说的ns1的命名空间URI $writer->startDocument('1.0', 'UTF-8'); // 构建SOAP-ENV:Header,关联对应的命名空间 $writer->startElementNS('SOAP-ENV', 'Header', $soapEnvNs); // 构建kontekstWywolania元素,同时声明wsu命名空间 $writer->startElement('kontekstWywolania'); $writer->writeAttribute('xmlns:wsu', $wsuNs); // 构建带全局前缀(比如ns1)的atrybut元素 $writer->startElementNS('ns1', 'atrybut', $globalNs); $writer->writeAttribute('nazwa', 'idPodmiotuOidRoot'); $writer->writeElement('wartosc', 'value'); $writer->endElement(); // 关闭ns1:atrybut $writer->startElementNS('ns1', 'atrybut', $globalNs); $writer->writeAttribute('nazwa', 'idPodmiotuOidExt'); $writer->writeElement('wartosc', 'anothervalue'); $writer->endElement(); // 关闭ns1:atrybut // 关闭所有嵌套元素 $writer->endElement(); // 关闭kontekstWywolania $writer->endElement(); // 关闭SOAP-ENV:Header $writer->endDocument(); // 输出最终的XML echo $writer->outputMemory();
关键注意事项
- 永远不要手动写
<ns1:atrybut>这种格式,startElementNS()会自动帮你处理前缀和命名空间的绑定,避免出现命名空间未声明的错误 - 如果某个命名空间需要全局生效,可以在根元素(比如SOAP-ENV:Envelope)上提前用
writeNamespace()注册,后续元素直接使用前缀即可 - 确保每个命名空间的URI和前缀对应正确,这是XML命名空间规范的核心要求
内容的提问来源于stack exchange,提问作者imclickingmaniac
相关产品推荐
相关产品推荐

