使用冒号分隔的标记名读取PHP中自关闭标记属性的值

时间:2014-11-18 09:17:51

标签: xml

第一篇文章。

在阅读"文件时出现问题"自闭合标记格式的属性值,例如 < foo:bar file =" text.file" /> 即可。

我可以在封闭标签中阅读RSS文档中的所有其他属性值。

使用以下演示代码读取/更新属性" file"值,自动关闭标签没有成功。

$obj = new DOMDocument();
$obj->load('List.rss');
$i = 0;
$xpath = new DOMXPath($obj);
foreach($xpath->query("//*[name()='foo:bar']") as $attrib)
{
if ($i == 1) { //location of the "foo:bar" value to manipulate..
    echo $attrib->nodeName; //prints foo:bar OK
    echo $attrib->nodeValue; //prints empty string
    $attrib->nodeValue = '?yes'; //attempt to update attribute value
}
$i++;
}

$ attrib-> nodeValue ='?yes&#39 ;;赋值使用< foo:bar file =" text.file"更新节点/>?是< / foo:bar> ,与所需的RSS格式不兼容。

我需要的是更新< foo:bar file =" text.file" /> < foo:bar file =" text.file?yes" /> ,基本上是在不添加结束标记的情况下即时添加查询字符串。

干杯

1 个答案:

答案 0 :(得分:0)

foo:bar表示这里是前缀foo的名称空间定义。在元素节点中查找xmlns:foo属性,或者是最近的祖先。

DOMNode :: $ nodeName不是" real"节点的名称。它存储在两个属性中。 DOMNode::$localName是带有前缀的名称(示例中为bar)。 DOMNode::$namespaceURI包含命名空间(xmlns:foo属性中的值)。

要获取命名空间节点,请在DOMXPath实例上使用您自己的前缀注册它。

$xml = '<foo:bar xmlns:foo="urn:foo" file="text.file" />';
$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXPath($dom);
$xpath->registerNamespace('f', 'urn:foo');

foreach ($xpath->evaluate('//f:bar') as $node) {
  $node->setAttribute('file', $node->getAttribute('file').'?query');
}

echo $dom->saveXml();

输出:

<?xml version="1.0"?>
<foo:bar xmlns:foo="urn:foo" file="text.file?query"/>