淺談如何利用PHP訪問和操作DOM
原創(chuàng)DOMê÷?¨ò?á???μμμ????-?á11£?ò??°??????·??êoí2ù×÷?aD???μμμ?·?·¨?£ê1ó?DOM£??a·¢è??±?éò?′′?¨XML?òHTML??μμ£?2ù×÷?ü??μ??á1?£????ó?¢DT??oíé?3y??μμ ?a???°?úèY?£?éò?′óè?o?±à3ìó???·??êDOM£?±???ê1ó?PHP 5 DOMà??1£??üê?PHPo?D?μ?ò?2?·?£?òò′?3yá?PHPía£?2?Dèòa°2×°???üèí?t?£
DOMê÷?úμ?×??-XML?ü??1?·?£?è?£o
1?¢Document?úμ? -- ±íê?DOMDocument?ó?ú
2?¢Element?úμ? -- ±íê?DOMElement?ó?ú
3?¢Attribute?úμ? -- ±íê?DOMAttr?ó?ú
4?¢Comment?úμ? -- ±íê?DOMComment?ó?ú
5?¢Text?úμ? -- ±íê?DOMText?ó?ú
ìáè??a??
?aò?D??ú?ééüè?o?′óDOMê÷?Dìáè??a??oí?μ£?±???ê1ó?Book.xml×÷?aày×ó??DD?μ?÷£????úèYè???μ¥1?ùê??£
??μ¥1 Book.xml
- <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
- <book>
- <!--XML Processing [part I] -->
- <name>XML Processing I</name>
- <author>John Smith Jr.</author>
- <publisher>HisOwnTM</publisher>
- <ISBN>111-222-333-4441</ISBN>
- <contents>
- <chapter_I>
- <title>What is XML about ?</title>
- <content>XML (Extensible Markup Language) is a ...</content>
- </chapter_I>
- <chapter_II>
- <title>SAX</title>
- <content>SAX is a simple API for ...</content>
- </chapter_II>
- <chapter_III>
- <title>StAX</title>
- <content>Much powerful and flexible, StAX, is very...</content>
- </chapter_III>
- <chapter_IV>
- <title>DOM
- <subtitle>DOM concept
- <continut>Starting to use DOM...</continut>
- </subtitle>
- <subchapter_IV_I>
- <title>First DOM application...</title>
<content>Here it is your first DOM application...</content> - </subchapter_IV_I>
- </title>
- </chapter_IV>
- <end>The end...</end>
- </contents>
- <!-- See you in XML Processing [part II] -->
- </book>
?è????±???ê1ó?μ?PHP′ú???1??°ü£?http://assets.devx.com/sourcecode/41975_oa_mainsource.zip£???Book.xmloí?1 ??°ü?a?1oó·??úí?ò??????????£
μúò???ê?àyó|ó?3ìDòê1ó?Book.xml??μμ£?ìáè?3?1?áaμ?ê÷£?è?oóê1ó?DOMElement?ó?úμ?getElementsByTagName·?·¨??ê?μúò???×ó?úμ?êμày£o
DOMNodeList DOMElement::getElementsByTagName(string $name)£o?a??·?·¨·μ???ùóD$name2?êy???¨μ?±ê????μ?×ó?a???£????μ?ày×ó2é?ò<book>?ù?úμ? £?è?oó2é?ò?üμ?×ó?úμ? <author>£?<publisher>oí <name>?a??£?????????×ó?úμ?μ?μúò???£?×?oó′òó??aD??úμ?μ??μ£o
- <?php
- // ′′?¨ò?????μμêμày
- $doc = new DOMDocument();
- //??è?Book.xml???t
- $doc->load( 'Book.xml' );
- //ê1ó?book±ê???????÷?ùóD?a??
- $books = $doc->getElementsByTagName( "book" );
- //ê1ó?author±ê???????÷?ùóD?a??
- $authors = $doc->getElementsByTagName( "author" );
- //·μ??μúò???±ê?????aauthorμ??a??
- $author = $authors->item(0)->nodeValue;
- //ò?publisher±ê???????÷?ùóD?a??
- $publishers = $doc->getElementsByTagName( "publisher" );
- //·μ??μúò????òμ?μ?±ê?????apublisherμ??a??
- $publisher = $publishers->item(0)->nodeValue;
- //???÷±ê?????anameμ??ùóD?a??
- $titles = $doc->getElementsByTagName( "name" );
- //·μ??±ê?????anameμ?μúò????òμ?μ??a??
- $title = $titles->item(0)->nodeValue;
- //′òó??òμ?μ??μ
- echo "$title - $author - $publisher \n";
- ?>
×?oóò?DDê?′òó?μúò???±êìa£?μúò???×÷??£?μúò???3?°?éì£?ê1ó?á?×?·?·???£?ê?3?£o
XML Processing I - John Smith Jr. - HisOwnTM
μY1é?ˉààDOMê÷
òò?aXML??μμ?á11?Dò???±ê???éò?°üà¨áíò???±ê??£¨·??§ê÷£?£?ê£???íê?ò?×ó?úμ?£?òò′????éò??ˉààíê??μ?ê÷?ò′óè?o??úμ??aê?μY1é?ˉàà×óê÷ ?£????μ?ày×óê?′óè?o??aê??úμ?£¨$node£??ˉàà????μ?XML×óê÷£?2¢áD3??úμ?μ???×?oí?μ?£
- function getNodesInfo($node)
- {
- if ($node->hasChildNodes())
- {
- $subNodes = $node->childNodes;
- foreach ($subNodes as $subNode)
- {
- if (($subNode->nodeType != 3) ||
- (($subNode->nodeType == 3) &&
- (strlen(trim($subNode->wholeText))>=1)))
- {
- echo "Node name: ".$subNode->nodeName."\n";
- echo "Node value: ".$subNode->nodeValue."\n";
- }
- getNodesInfo($subNode);
- }
- }
- }
é???μ?ày×óê1ó?????μ?ì??tè¥3yá??ùóD????±??úμ?£?è?ê?3??′?eà′?ü?é??£o
- if (($subNode->nodeType != 3) ||
- (($subNode->nodeType == 3) &&
- (strlen(trim($subNode->wholeText))>=1)))
?°??μ?′ú???ì2é?úμ?ê?·?±?′|àí£?í??ù£????éò?éè???¤?¨ò?μ?preserveWhiteSpaceê?D?£??üò?3yè?óàμ???°×£???è??μê?TRUE?£
?aá?2aê??a??1|?ü£??????a??ày×ó′?μYBook.xml??μμμ??ù?úμ???μY1éoˉêygetNodesInfo£?è?oó′òó?3?????DOMê÷μ?±ê??oí?μ£o
- <?php
- //′′?¨ò?????μμêμày
- $doc = new DOMDocument();
- //??è?Book.xml???t
- $doc->load( 'Book.xml' );
- //éè?????óê÷?ù
- $root = $dom->firstChild;
- // μY1éoˉêyáD3?×óê÷μ??ùóD?úμ?
- function getNodesInfo($node)
- {
- if ($node->hasChildNodes())
- {
- $subNodes = $node->childNodes;
- foreach ($subNodes as $subNode)
- {
- if (($subNode->nodeType != 3) ||
- (($subNode->nodeType == 3)
- &&(strlen(trim($subNode->wholeText))>=1)))
- {
- echo "Node name: ".$subNode->nodeName."\n";
- echo "Node value: ".$subNode->nodeValue."\n";
- }
- getNodesInfo($subNode);
- }
- }
- }
- //μ÷ó?getNodesInfooˉêy
- getNodesInfo($root);
- ?>
í?1??ê?á?ê?3?μ?D?2?·??úèY
í?- 1??μμ?úèY£o?a??í???ê?á?í¨1ygetNodesInfoμY1éoˉêy??DDBook.xmlμ?2?·?ê?3??úèY
#p#
???óD??úμ?
DOMNode?ó?ú°üà¨?à??′′?¨D??úμ?oí?úDOMê÷?D2?è??úμ?μ?·?·¨£?è?1?òa′′?¨ò???D??úμ?£??éò?ê1ó?createElement?òcreateTextNode·?·¨£?è?oó £??aá????óò???D??úμ?μ?DOMê÷é?£??éò?μ÷ó?appendChild?òinsertBefore·?·¨£?appendChild·?·¨???óò???D?μ?×ó?úμ?μ?ì??¨?úμ?μ?×ó?úμ?áD±íμ?oó??£??? insertBefore·?·¨ê??úì??¨?úμ?μ??°??2?è?ò????úμ??£
????ê??aD?·?·¨μ??-Dí£o
1?¢DOMElement createElement(string $name [, string $value ]) £o?a??·?·¨′′?¨á?ò???DOMElementààμ?êμày£?$name2?êy±íê?D??a??μ?±ê????£?$value2?êy ±íê??a??μ??μ£???ò2?éò?é?oóê1ó?DOMElement->nodeValueê?D????μ?£
2?¢DOMText createTextNode(string $content)£o?a??·?·¨′′?¨á?ò???DOMTextààμ?êμày£?$content2?êy±íê?D?μ???±??úμ?μ???±??úèY?£
3?¢DOMNode DOMNode::appendChild(DOMNode $newnode)£o?a??oˉêyà??1á???óD×ó?úμ????2$newnode2?êy£??ò′′?¨ò???D?μ?°üà¨???¨?úμ?μ?×ó?úμ?áD±í?£
4?¢DOMNode DOMNode::insertBefore(DOMNode $newnode [,DOMNode $refnode])£o?a??·?·¨?ú$refnode?úμ??°2?è?$newnode2?êy£?è?1?$refnode?úμ??aê§£?D?μ? ?úμ??íìí?óμ??úμ?μ?×ó?úμ?áD±í?°?£
????μ?ày×ó′′?¨á?ò???<bibliography>?úμ?£?2¢????×·?óμ??úμ?μ????2£o
- //′′?¨ò???D??a??
- $newElement = $dom->createElement('bibliography','Martin Didier, Professional XML');
- //ê1ó?appendChildoˉêy????×·?óμ??ù?úμ?
- //μ÷ó?appendChildoˉêy
- appendNewChild($root,$newElement);
- //?a??oˉêy×·?óá?ò???D?μ?×ó?úμ?
- function appendNewChild($currentNode, $node)
- {
- $currentNode->appendChild($node);
- }
è?1???í¨1ygetNodeInfo()oˉêy??DDμ?3??á1?£??????á?′μ?è?í?2?ùê?μ?ê?3??£
í?- 2 ×·?óμ??úμ?£o?a??í???ê?á?D??óμ?<bibliography>?úμ?oí?üμ??úèY
????μ?ày×óê??ú<publisher>?úμ????óò???<foreword>×ó?úμ?£o
- //′′?¨ò???D?μ?<foreword>?a??
- $newElement = $dom->createElement('foreword',
- 'What I love about this book is that it '.
- 'grew out of just such a process, '.
- 'and shows it on every page.');
- //éè??òyó??úμ?
- $allContents = $dom->getElementsByTagName('publisher');
- $contents = $allContents->item(0);
- //μ÷ó?insertNewChildoˉêy
- insertNewChild($contents,$newElement);
- //?a??oˉêy2?è?ò???D?μ?×ó?úμ?×÷?a $currentNodeμ?μúò???×ó?úμ?
- function insertNewChild($currentNode, $node)
- {
- $currentNode->insertBefore(
- $node, $currentNode->firstChild);
- }
í¨1ygetNodesInfo??DDDT??oóμ???μμ£???ê?D?μ??úμ?£?è?í?3?ùê??£
í?- 3 2?è??úμ?£o?a??í?????ê?á??ú<publisher>?úμ??°2?è?á?<foreward>×ó?úμ?
?úμ?????
????ò????úμ?òa??×?′′?¨ò???oíμ±?°?úμ?ò??£ò??ùμ??úμ?£??????úμ?ê±ê1ó?cloneNode·?·¨?£
DOMNode DOMNode::cloneNode([ bool $deep])£o′′?¨μ±?°μ?????£?$deep2?êy???¨ê?·?òa??±′μ±?°?úμ?μ?×ó?úμ?£?????è??μê?false?£????μ?ê?ày′ú????ê????? <author>?a??£?2¢×÷?a?′<author>?a??μ?×ó?úμ?£?í?4??ê?á?ê?3??úèY£o
- //éè??òyó??úμ?
- $author = $root->getElementsByTagName('author')->item(0);
- //μ÷ó?cloningNodeoˉêy
- cloningNode($author);
- //?a??oˉêy????$currentNode
- function cloningNode($currentNode)
- {
- $clonenode = $currentNode -> cloneNode(true);
- $newnode = $currentNode->appendChild($clonenode);
- }
í?- 4 ?????úμ?£o????<author>×ó?úμ?2¢????·??ú?′<author>?úμ???£??′?úμ?μ???±??μ±?3éá?·Yá?£?òò?a?ì?÷?úμ?μ???±??μê±ò2?ì?÷á???×ó?úμ?μ? ?μ
#p#
ò?3y×ó?úμ?
ê1ó?removeChild·?·¨′óDOMê÷?Dò?3y×ó?úμ??£
DOMNode DOMNode::removeChild(DOMNode $oldnode)£o?a??oˉêyò?3yò???×ó?úμ?£?$oldnode2?êy??3?òaò?3yμ?×ó?úμ??£????μ?ê?ày′ú??′óBook.xml??μμ?Dò?3y×ó ?úμ?£?′óí?5?D??ê?μ?ê?3??úèY?éò??′μ?bibliography?úμ???ê§á??£
í?- 5 ò?3y?úμ?£oò?3y×?oóò???×ó?úμ?<bibliography>oó£???D?áD3?á??úμ?μ???3??μ£???ê??úμ?è·êμ±?ò?3yá?
ì????úμ?
?aá?ó?ò???D??úμ?ì???ò?óDμ??úμ?£?ê1ó?replaceChild·?·¨?£
DOMNode DOMNode::replaceChild(DOMNode $newnode, DOMNode $oldnode)£o?a??oˉêyê1ó?$newnode×ó?úμ?ì???$oldnode?úμ??£
àyè?£??ùéè????ó?D?μ?code×ó?úμ?ì???ISBN×ó?úμ?£o
- //??è?ISBN?úμ?
- $element = $dom->getElementsByTagName('ISBN')->item(0);
- //′′?¨D?μ?<code>?a??
- $code = $dom->createElement('code', '909090');
- //μ÷ó?replacingNodeoˉêy
- replacingNode($code,$element);
- //?a??oˉêyê1ó?$nodeì???$currentNode
- function replacingNode($currentNode, $node)
- {
- $node->parentNode->replaceChild($currentNode, $node);
- }
í?6?D??ê?μ?ê?3??úèY±í?÷?úμ?±?ì???á?
í?- 6 ì????úμ?£o?aà???ê?μ?ê?ó?D?μ?<code>?úμ?ì???<ISBN>?úμ?oóμ???μμ?úèY
μ?è??úμ?
ê1ó?importNode·?·¨′óáíò???ê÷??±′ò????úμ?μ?μ±?°μ?ê÷?£
DOMNode DOMDocument::importNode(DOMNode $importedNode [,bool $deep])£o?a??·?·¨′óáíò???XML??μμμ?è?ò????úμ?£?è?oó2?è?μ±?°??μμμ?DOMê÷?D£? $importedNode2?êy??3?á?òaμ?è?μ??úμ?£?μ?è?μ??úμ?±íê??-ê??úμ?μ?ò?·Y??±′£?òò′?μ?è?2ù×÷2??áDT??ía2?ê÷£?$deep2?êy????ê?·?μ?è?±?μ?è??úμ?μ?é??è£??μ?a TRUEê±£?μ?è?íê??μ??úμ?×óê÷£??aFALSEê±£???μ?è??úμ?±?éí?£
????μ?ê?ày′óBook_continue.xml???tμ?è?<continue>?úμ?μ?Book.xml£?????ê?Book_continue.xml??μμμ??úèY£o
- <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
- <!--chapter V-->
- <continue>
- <chapter_V>
- <title>XPath</title>
- <content>XPath is language for...</content>
- </chapter_V>
- <![CDATA[
- This chaper is a bonus to...
- ]]>
- <printing cap_I="click_here_for_chapter_I"
- cap_II="click_here_for_chapter_II"
- cap_III="click_here_for_chapter_III"
- cap_IV="click_here_for_chapter_IV"
- cap_V="click_here_for_chapter_V" />
- </continue>
- ????ê?μ?è?<continue>?úμ?μ?′ú??£o
- <?php
- $olddoc = new DOMDocument;
- $olddoc->load("Book_continue.xml");
- //?ò??μ?è?μ?ò???D???μμμ??úμ?
- $node = $olddoc->getElementsByTagName("continue")->item(0);
- $newnewdoc = new DOMDocument;
- $newdoc->formatOutput = true;
- $newdoc->load("Book.xml");
- //μ?è??úμ??°???ùóD×ó?úμ?μ???μμ
- $node = $newdoc->importNode($node, true);
- //è?oó×·?óμ??ù?úμ?
- $newdoc->documentElement->appendChild($node);
- echo "\nThe 'new document' after copying the nodes into it:\n";
- $root = $newdoc->firstChild;
- function getNodesInfo($node)
- {
- if ($node->hasChildNodes())
- {
- $subNodes = $node->childNodes;
- foreach ($subNodes as $subNode)
- {
- if (($subNode->nodeType != 3) ||
- (($subNode->nodeType ==3) &&
- (strlen(trim($subNode->wholeText))>=1)))
- {
- echo "Node name: ".$subNode->nodeName."\n";
- echo "Node value: ".$subNode->nodeValue."\n";
- }
- getNodesInfo($subNode);
- }
- }
- }
- getNodesInfo($root);
- ?>
í?7??ê??°??′ú??μ?ê?3?
í?- 7 μ?è??úμ?£o?aà???ê?á?′óBook_continue.xmlμ?è??úμ?2¢×·?óμ?Book.xmloóμ??ù×ó
?ì2é?úμ?μ?μèí?D?
?ì2éá????úμ?ê?·??àí?ê1ó?isSameNode·?·¨?£
bool DOMNode::isSameNode(DOMNode $node)£oμ±?úμ?ê??àμèμ?ê±oò£??a??oˉêy·μ??ò???2????μTRUE£?·??ò·μ??FALSE£?$node2?êy±íê???òaoíμ±?°?úμ???DD±è?? μ??úμ??£
×¢òa±è??2?ê??ùóú?úμ?μ??úèY??DDμ?£o
- //?ì2éá????úμ?ê?·??àí?
- $author1 = $root->getElementsByTagName('autor')->item(0);
- $author2 = $root->getElementsByTagName('autor')->item(1);
- //μ÷ó?verifyNodesoˉêy
- verifyNodes($author1,$author2);
- function verifyNodes($currentNode, $node)
- {
- if (($currentNode->isSameNode($node))==true)
- {
- echo "These two nodes are the same";
- }
- }
′′?¨D?μ?ê÷
PHP 5 DOMà??1?éò?è???′óá??aê?11?¨DOMê÷£?????μ?ê?ày′′?¨á?ò???è?D?μ?XML??μμ£?ê1ó?á?á???D?oˉêy′′?¨×¢êíoíCDATA?úμ??£
1?¢DOMComment DOMDocument::createComment(string $data)£o′′?¨ò???D?μ?×¢êí?úμ?£?$data2?êy±íê??úμ?μ??úèY?£
2?¢DOMCDATASection DOMDocument::createCDATASection(string $data)£o′′?¨ò???D?μ?CDATA?úμ?£?$data2?êy±íê??úμ?μ??úèY?£
- <?php
- //′′?¨ò?????μμêμày
- $document = new DOMDocument();
- //ê1ó???????ê??ˉê?3?
- $document->formatOutput = true;
- //′′?¨ò???×¢êí
- $comment = $document->createComment('Beautiful flowers!!!');
- $document->appendChild( $comment );
- //′′?¨<flowers>?ù?a??
- $root = $document->createElement( 'flowers' );
- $document->appendChild( $root );
- //′′?¨<tulips>×ó?úμ?
- $tulips = $document->createElement( 'tulips' );
- //′′?¨<tulips>?a??μ?μúò???×ó?úμ?<bulbs>£?2¢éè????ê?D?
- $bulbs_1 = $document->createElement( 'bulbs' );
- $bulbs_1->setAttribute('price','? 7.65');
- $bulbs_1->appendChild($document->createTextNode( 'Parrot'));
- $tulips->appendChild( $bulbs_1 );
- //′′?¨<tulips>?a??μ?μú?t??×ó?úμ?<bulbs>£?2¢éè????ê?D?
- $bulbs_2 = $document->createElement( 'bulbs' );
- $bulbs_2->setAttribute('color','magenta');
- $bulbs_2->appendChild($document->createTextNode( 'Lily flowering' ));
- $tulips->appendChild( $bulbs_2 );
- //×·?ó<tulips>?úμ?μ??ù?úμ?oó
- $root->appendChild( $tulips );
- //′′?¨CDATAD??ú
- $cdata = $document->createCDATASection(
- '<gladiolus><species>Sword Lily</species>'.
- '<species>Starface</species></gladiolus>');
- $document->appendChild( $cdata );
- //±£′????óê÷μ?Flowers.xml
- echo $document->saveXML();
- $document->save('Flowers.xml');
- ?>
- D?μ?Flower.xml??μμ?úèYè???£o
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <!--Beautiful flowers!!!-->
- <flowers>
- <tulips>
- <bulbs price="? 7.65">Parrot</bulbs>
- <bulbs color="magenta">Lily flowering</bulbs>
- </tulips>
- </flowers>
- <![CDATA [<gladiolus>
- <species>Sword Lily</species>
- <species>Starface</species>
- </gladiolus>
- ]]>
??μ¥2?Dμ?′ú??′′?¨á?ò??????óê÷£?2¢????±£′??aFlowers.xml?£
??μ¥2 ′′?¨ò???D?μ?DOMê÷
±????òμ¥?ééüá?PHP 5 DOMà??1£?2¢?ééüè?o?ê1ó??ü2ù×÷XML£¨?òHTML£???μμ£?ò??°è?o?′óá?′′?¨ò???DOMê÷?£
??±à?-í?????