动态创建的 getElementById XML
getElementById on dynamically created XML
这个例子不言自明,我希望 getElementById 到 return 第二个元素,但给出了 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"));
使用 XML getElementById 方法 returns 元素的某个属性已在 DTD 中定义为具有类型 ID
而不是命名为 id
的元素。所以你需要确保你有一个 DTD 为名为 element
的元素和名为 id
的属性声明类型 ID
如果你想能够使用该方法:
$dom = new DOMDocument();
$dom->loadXML("<!DOCTYPE root [<!ATTLIST element id ID #IMPLIED>]><root/>");
$root = $dom->documentElement;
好像在PHPDOMAPI做
$el = $dom->createElement("element");
$el->setAttribute("id", "2");
$el->setIdAttribute("id", TRUE);
作为 DTD 的替代方法。
如果由 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"
这个例子不言自明,我希望 getElementById 到 return 第二个元素,但给出了 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"));
使用 XML getElementById 方法 returns 元素的某个属性已在 DTD 中定义为具有类型 ID
而不是命名为 id
的元素。所以你需要确保你有一个 DTD 为名为 element
的元素和名为 id
的属性声明类型 ID
如果你想能够使用该方法:
$dom = new DOMDocument();
$dom->loadXML("<!DOCTYPE root [<!ATTLIST element id ID #IMPLIED>]><root/>");
$root = $dom->documentElement;
好像在PHPDOMAPI做
$el = $dom->createElement("element");
$el->setAttribute("id", "2");
$el->setIdAttribute("id", TRUE);
作为 DTD 的替代方法。
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"