我正在使用DOMDocument来读取XML(SVG),其中包含名称空间。 我遍历所有节点的属性,但我似乎无法获得根元素的'xmlns'类型属性。
XML看起来像这样:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.48.1 "
viewBox="0,0 534,616"
...
>
当我尝试点什么时,请点击这个:
$node= DOMDocument->documentElement;
foreach($node->attributes as $attribute) {
echo $attribute->nodeName."\n";
}
我确实得到了'其他'属性,比如id,viewBox等,但不是xlmns:dc等。
有没有办法获得这些呢?
答案 0 :(得分:1)
尝试使用namespaceURI
此节点的名称空间URI,如果未指定,则为NULL。
要获取根节点的默认namespaceURI,请使用
$dom->documentElement->namespaceURI;
在链接副本中查看我的答案,了解如何获取所有命名空间属性。
替代方案是使用XPath:
$xpath = new DOMXPath($dom);
foreach ($xpath->query('namespace::*', $context) as $node) {
echo $node->nodeValue;
}
答案 1 :(得分:1)
如果要解析整个文档,从每个属性值中提取名称空间前缀,然后使用DOMNode::lookupNamespaceURI
(字符串$ prefix)构建prefix-uri映射将比使用simplexml减少开销。