【问题标题】:Add additional namespace to XML file向 XML 文件添加额外的命名空间
【发布时间】:2019-04-14 17:07:39
【问题描述】:

我正在尝试在 PHP 中向 XML 文件的 <gpx> 元素添加一个额外的命名空间。这是现有的<gpx> 元素(注意不包括命名空间“stunninghikes”):

<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" 
    xmlns:gpsies="https://www.gpsies.com/GPX/1/0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    creator="GPSies https://www.gpsies.com - Amden - Chapf (1296m) - Arvenb&amp;#252;el - Vorderh&amp;#246;hi - Gulmen (1788m) - Hinter H&amp;#246;hi - Niederschlag" 
    version="1.1" 
    xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd https://www.gpsies.com/GPX/1/0 https://www.gpsies.com/gpsies.xsd">
    <content>
    (Lots more content)
    </content>
</gpx>

我想要将属性xmlns:stunninghikes="https://stunninghikes.com/GPX/1/0" 添加到&lt;gpx&gt; 元素中。

我尝试了许多使用createAttributeNSsetAttributeNS 的选项,但无法正常工作!这是我尝试过的一个例子:

$gpxDoc = new DomDocument;
$gpxDoc->load($gpxFileName);
$gpxNode = $gpxDoc->getElementsByTagName('gpx'); 
$gpxNode->createAttributeNS('https://stunninghikes.com/GPX/1/0', 'xmlns:stunninghikes');
$gpxDoc->appendChild($gpxNode);

有什么想法吗?

【问题讨论】:

    标签: php xml dom


    【解决方案1】:

    您的尝试非常接近。您不能手动更改文档的 xmlns 属性,而是会收到 DOMException 抱怨“命名空间错误”。

    您可以做的是创建一个属性(任何属性),并且 XML 文档将自动更新以包含命名空间,即使您没有将其附加到文档中:

    $gpxDoc = new DomDocument;
    $gpxDoc->load($gpxFileName);
    $gpxDoc->createAttributeNS('https://stunninghikes.com/GPX/1/0', 'stunninghikes:dummy');
    echo $gpxDoc->saveXML();
    

    输出:

    <?xml version="1.0" encoding="UTF-8"?>
    <gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpsies="https://www.gpsies.com/GPX/1/0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:stunninghikes="https://stunninghikes.com/GPX/1/0" creator="GPSies https://www.gpsies.com - Amden - Chapf (1296m) - Arvenb&amp;#252;el - Vorderh&amp;#246;hi - Gulmen (1788m) - Hinter H&amp;#246;hi - Niederschlag" version="1.1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd https://www.gpsies.com/GPX/1/0 https://www.gpsies.com/gpsies.xsd">
    
        <content>
        (Lots more content)
        </content>
    </gpx>
    

    【讨论】:

    • 这很烦人。我很接近!感谢您提供简单的解决方案