php - 使用 SimpleXMLElement 时添加命名空间

标签 php simplexml

这就是我想要的

<!-- language: lang-xml -->
<ws:Test>
    <ws:somename2>somevalue2</ws:somename2>
    <ws:make>
        <ws:model>foo</ws:model>
        <ws:model>bar</ws:model>
    </ws:make>
</ws:Test>

这是我当前的代码

<!-- language: lang-php -->
$xmlTest = new SimpleXMLElement('<Test/>', 0, false, 'ws', true);
$xmlTest->addChild("ws:somename2", "somevalue2", 'http://microsoft.com/wsdl/types/');
$make = $xmlTest->addChild('ws:make', null, 'ws');
#$make->addAttribute('name','Ford');
$make->addChild('ws:model', 'foo', 'ws');
$make->addChild('ws:model', 'bar', 'ws');
header ("Content-Type:text/xml");
print_r($xmlTest->asXML());

但它输出

<!-- language: lang-xml -->
<Test>
    <ws:somename2>somevalue2</ws:somename2>
    <ws:make>
        <ws:model>foo</ws:model>
        <ws:model>bar</ws:model>
    </ws:make>
</Test>

如您所见,测试中缺少 ws:

最佳答案

SimpleXML 有一个不寻常的怪癖,其中命名空间前缀是从根元素中过滤的。我不确定为什么会这样。

但是,我使用的一个变通方法基本上是在前缀上加前缀,这样解析器就只删除第一个,而留下第二个

$xmlTest = new SimpleXMLElement('<xmlns:ws:Test></xmlns:ws:Test>', LIBXML_NOERROR, false, 'ws', true);
$xmlTest->addAttribute('xmlns:xmlns:ws', 'http://url.to.namespace');
$xmlTest->addAttribute('xmlns:xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');

这似乎对我有用,但我很想知道为什么 SimpleXML 会这样做。

关于php - 使用 SimpleXMLElement 时添加命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6927567/

相关文章:

javascript - 在 jquery 中复制或克隆整行记录

php - 如何在带有嵌套数组和对象的 php 中使用递归函数?

php - 从 xml 解析时转换 SimpleXMLElement 对象

php - php中rand函数的问题

javascript - 提交大文件 Laravel 和 Ajax

php - 在Elasticsearch中定义自定义分析器进行查询时出错

php - 获取xml中的特定节点?

php - 无法在 ubuntu 16.04 上安装 simplexml 扩展

php - 无法使用 simplexml_load_file 进入目录

php - 在 PHP 代码中隐藏一个 div 标签