【问题标题】:getElementById on dynamically created XML动态创建的 XML 上的 getElementById
【发布时间】:2016-05-13 18:40:56
【问题描述】:

这个例子不言自明,我希望 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"));

【问题讨论】:

    标签: php xml domdocument


    【解决方案1】:

    对于 XML,getElementById 方法返回在 DTD 中定义为具有类型 ID 的特定属性的元素,而不是名为 id 的元素。因此,如果您希望能够使用该方法,则需要确保有一个 DTD 为名为 element 的元素和名为 id 的属性声明类型 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 的替代方法。

    【讨论】:

    • 你能给我指出一个工作示例或建议另一种搜索方法来查找 谢谢。
    【解决方案2】:

    id 如果由 DTD/XSD 或 API 定义,则只是一个 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-21
      • 2015-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 2022-11-19
      • 2016-03-27
      相关资源
      最近更新 更多