第一篇文章。
在阅读"文件时出现问题"自闭合标记格式的属性值,例如 < 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" /> ,基本上是在不添加结束标记的情况下即时添加查询字符串。
干杯
答案 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"/>