在一个节点的XLink属性:创建XML的xmlns(Create XML with xmlns:xl

2019-07-20 14:32发布

我试图添加产生这样的输出:

<mets ....
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.loc.gov/METS/       
http://www.loc.gov/standards/mets/mets.xsd">

我可以生成一切正常,但不能添加xmlns:xlink属性。 我得到的最接近的是:

$this->xml = new SimpleXMLElement('<mets></mets>');
$mets->addAttribute("xlink:someName", "blabla", "http://www.w3.org/1999/xlink");    
$mets->addAttribute("xsi:schemaLocation", "http://www.loc.gov/METS/  
http://www.loc.gov/standards/mets/mets.xsd",
"http://www.w3.org/2001/XMLSchema-instance");

产生:

<mets ....
xmlns:xlink="http://www.w3.org/1999/xlink"
----begin of part I don't desire-----
xlink:someName="blablabla"
----end of  part I don't desire-----
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.loc.gov/METS/       
http://www.loc.gov/standards/mets/mets.xsd">

如何添加xmlns:xlink无添加xlink:somethingElse

Answer 1:

我想出了解决的方法是相当简单的:

因为

$mets->addAttribute("xlink:someName", "", "http://www.w3.org/1999/xlink");

会随时添加两个属性-一个用于命名空间声明( xmlns:xlink ),然后在属性你实际添加( xlink:someName ) -所有你需要做的就是再删除不需要添加的属性和前缀命名空间属性仍将:

unset($mets->attributes('xlink', true)['someName']);

完整的示例:

$mets = new SimpleXMLElement('<mets></mets>');
$mets->addAttribute("xlink:someName", "", "http://www.w3.org/1999/xlink");
unset($mets->attributes('xlink', true)['someName']);
echo $mets->asXML();

输出:

<?xml version="1.0"?>
<mets xmlns:xlink="http://www.w3.org/1999/xlink"/>

然而,这通常不应该是必要的。 你要么需要使用的东西的命名空间 - 那么simplexml的将它添加在需要的时候 - 或者你不需要它,那么就没有必要添加。

XML本身根本没有要求申报未使用的命名空间。 因此,你可能可以离开它,也或者你只需​​要加它,你需要添加它,例如特定的XLink元素/属性以后。

支持命名空间的任何XML解析器将支持任何格式良好的XML + Namspaces文件,所以应该真的没什么可担心的根元素是否有声明,并与前缀。 SimpleXML只需简单护理的是,只需添加在你需要它的属性的XLink。 例:

$mets = new SimpleXMLElement('<mets></mets>');
$child = $mets->addChild('child');
$child->addAttribute('xlink:href', 'child.xml', 'http://www.w3.org/1999/xlink');
$child = $child->addChild('child');
$child->addAttribute('xlink:href', 'child.xml', 'http://www.w3.org/1999/xlink');
echo $mets->asXML();

输出:

<?xml version="1.0"?>
<mets>
  <child xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="child.xml">
    <child xlink:href="child.xml"/>
  </child>
</mets>


文章来源: Create XML with xmlns:xlink attribute in a node