我正在尝试添加生成这样的输出:
<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
?
答案 0 :(得分:4)
我提出的解决方案非常简单:
由于
$mets->addAttribute("xlink:someName", "", "http://www.w3.org/1999/xlink");
将始终添加两个属性 - 一个用于命名空间声明(xmlns:xlink
),然后添加您实际添加的属性(xlink:someName
) - 您需要做的就是删除不需要的添加属性和prefix namespace属性将保留:
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>