PHP: Bir DOMElement tüm ilan ad almak

2 Cevap php

Ben içeren bir xml dosyasını ayrıştırmak için DOM extension kullanıyorum xml namespaces. Ben alanı bildirimleri tıpkı diğer niteliği gibi muamele olduğunu sanırdım, ama benim testleri katılmıyorum görünüyor. Böyle başlayan bir belge var:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="http://purl.org/rss/1.0/"
    xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:prism="http://purl.org/rss/1.0/modules/prism/"
    xmlns:admin="http://webns.net/mvcb/"
    >

Ve böyle bir test kodu:

$doc = new DOMDocument();
$doc->loadXml(file_get_contents('/home/soulmerge/tmp/rss1.0/recent.xml'));
$root = $doc->documentElement;
var_dump($root->tagName);
# prints 'string(7) "rdf:RDF"'
var_dump($root->attributes->item(0));
# prints 'NULL'
var_dump($root->getAttributeNode('xmlns'));
# prints 'object(DOMNameSpaceNode)#3 (0) {}'

Yani sorular şunlardır:

  1. Ben belgeleri bulmak nerede bilen var mı DOMNameSpaceNode? A search on php.net herhangi bir yararlı bir sonuç ortaya koymamıştır.
  2. Bunu nasıl DOMElement tüm bu alanı bildirimleri ayıklamak?

2 Cevap

Unless there is a more direct way you can use XPath and its namespace axis.
e.g.

<?php
$doc = new DOMDocument;
$doc->loadxml('<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="http://purl.org/rss/1.0/"
    xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:prism="http://purl.org/rss/1.0/modules/prism/"
    xmlns:admin="http://webns.net/mvcb/"
    >
...
</rdf:RDF>');
$context = $doc->documentElement;

$xpath = new DOMXPath($doc);
foreach( $xpath->query('namespace::*', $context) as $node ) {
  echo $node->nodeValue, "\n";
}

baskılar

http://www.w3.org/XML/1998/namespace
http://webns.net/mvcb/
http://purl.org/rss/1.0/modules/prism/
http://purl.org/rss/1.0/modules/syndication/
http://purl.org/dc/elements/1.1/
http://purl.org/rss/1.0/modules/taxonomy/
http://purl.org/rss/1.0/
http://www.w3.org/1999/02/22-rdf-syntax-ns#

edit and btw: I haven't found documentation for DOMNameSpaceNode either. But you can "deduct" (parts of) its functionality from the source code in ext/dom/php_dom.c
It doesn't seem to expose any methods and exposes the properties

"nodeName", "nodeValue", "nodeType",
"prefix", "localName", "namespaceURI",
"ownerDocument", "parentNode"

Tüm ilgili DOMNode özellikleri olarak aynı işlevleri tarafından ele.

, Unutmayın

echo $root->getAttributeNode('xmlns')->nodeValue . "\n";
echo $root->getAttribute('xmlns') . "\n";
echo $root->getAttribute('xmlns:syn') . "\n";

Tüm beklendiği gibi çalışma ve baskı dışarı

http://purl.org/rss/1.0/
http://purl.org/rss/1.0/
http://purl.org/rss/1.0/modules/syndication/

DOMNameSpaceNode Bir Düğüm, bir NodeCollection çünkü.

Sadece açıklığa kavuşturulması, bu (VolkerK tarafından açıklandığı gibi) PHP DOM uzantısı değişiklikleri, XPath'daki şey ne olursa olsun belgelerin, tüm ad almak için sadece yerli yoludur sürece.