关于动态创建的XML的getElementById

时间:2016-05-13 18:40:56

标签: php xml domdocument

该示例说明了一切,我希望getElementById返回第二个元素,但是给出了NULL。怎么样?

$dom = new DOMDocument();

$root = $dom->createElement("root");

$el = $dom->createElement("element");
$el->setAttribute("id", "1");
$root->appendChild($el);

$el = $dom->createElement("element");
$el->setAttribute("id", "2");
$root->appendChild($el);

$dom->appendChild($root);

// OK
echo $dom->saveXML();

// NOT OK
var_dump($dom->getElementById("2"));

2 个答案:

答案 0 :(得分:2)

使用XML,getElementById方法返回在DTD中已定义某个属性的类型为ID的元素,而不是那些名为id的元素。因此,如果您希望能够使用该方法,则需要确保DTD为名为ID的元素和名为element的属性声明类型id

$dom = new DOMDocument();
$dom->loadXML("<!DOCTYPE root [<!ATTLIST element id ID #IMPLIED>]><root/>");

$root = $dom->documentElement;

似乎在PHP DOM API中正在进行

$el = $dom->createElement("element");
$el->setAttribute("id", "2");
$el->setIdAttribute("id", TRUE);

可作为拥有DTD的替代方案。

答案 1 :(得分:0)

如果由DTD / XSD或API定义,

id只是一个id属性。 XML中唯一预定义的id属性是xml:id{http://www.w3.org/XML/1998/namespace}id)。

您可以使用Xpath按其属性值获取节点。它不需要id属性:

$xml = <<<'XML'
<?xml version="1.0"?>
<root>
  <element id="1"/>
  <element id="2"/>
  <element id="3"/>
</root>
XML;

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);

var_dump(
  $xpath->evaluate('//*[@id=2]')->item(0)->getAttribute('id')
);

输出:

string(1) "2"