php - 使用 xmlns :xlink attribute in a node 创建 XML

标签 php xml simplexml

我正在尝试添加生成这样的输出:

<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">

如何在不添加 xlink:somethingElse 的情况下添加 xmlns:xlink

最佳答案

我提出的解决方案相当简单:

因为

$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 元素/属性。

任何支持 namespace 的 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>

关于php - 使用 xmlns :xlink attribute in a node 创建 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15101271/

相关文章:

java - 在menu.xml中使用actionLayout时android中的NullPointerException

php - 有没有办法将 PHP SimpleXMLElement 添加到另一个 SimpleXMLElement?

php - SimpleXML 如何获取节点的行号?

php - 使用 php 和 mysqli 填充下拉框

php - 来自数据库的随机图像,带有 id 的链接

Php 获取 LC_MONETARY 的当前语言环境

php - 如何使用 SimpleXMLElement 获取 XML 根元素的属性

javascript - 确认 jquery 模态弹出窗口后提交表单

javascript - 计算 XML 中的 XPath 表达式

python - 从混合内容文档中提取多个 xml 树