2

重複の可能性:
PHP DOM XML 解析を単純化する - どのように?

ここに私のXML(c.xml)があります:

<?xml version="1.0" encoding="utf-8"?>
<root>
    <head>
        <title id="title">Hello</title>
    </head>
</root>

私がやること:

$dom = new DOMDocument;

$dom->load('./c.xml');

var_dump($dom->getElementById('title'));die(); // returns NULL

ここで何が問題なのですか?

UPD

$dom->validate();戻り値DOMDocument::validate(): no DTD found!

4

1 に答える 1

11

マニュアルには、これが発生する理由が説明されていると思います

この関数を機能させるには、DOMElement->setIdAttribute() でいくつかの ID 属性を設定するか、属性を ID 型に定義する DTD を設定する必要があります。後者の場合、この関数を使用する前に、DOMDocument->validate() または DOMDocument->validateOnParse でドキュメントを検証する必要があります。

潜在的な修正:

  1. を呼び出すと、何らかの理由でエラーに関係なく$dom->validate();、後で を使用できます。$dom->getElementById()
  2. 検証したくない場合は、XPath を使用します。

    $x = new DOMXPath($dom);

    $el = $x->query("//*[@id='title']")->item(0);// id=title を探す

カスタム DTD の使用例:

$dtd = '<!ELEMENT note (to,from,heading,body)>
        <!ELEMENT to (#PCDATA)>
        <!ELEMENT from (#PCDATA)>
        <!ELEMENT heading (#PCDATA)>
        <!ELEMENT body (#PCDATA)>';

$systemId = 'data://text/plain;base64,'.base64_encode($dtd);

$creator = new DOMImplementation;
$doctype = $creator->createDocumentType($root, null, $systemId); //Based on your DTD from above
于 2012-09-06T11:18:43.930 に答える