2012-10-08 141 views
0

我寫了一個小幫手函數來用xpath進行基本的搜索替換,因爲我發現它很容易編寫很短的操作,同時很容易閱讀和理解。php xml generation with xpath

代碼:

<?php 
function xml_search_replace($dom, $search_replace_rules) { 
    if (!is_array($search_replace_rules)) { 
     return; 
    } 

    $xp = new DOMXPath($dom); 

    foreach ($search_replace_rules as $search_pattern => $replacement) { 
     foreach ($xp->query($search_pattern) as $node) { 
      $node->nodeValue = $replacement; 
     } 
    } 
} 

的問題是,現在我需要在XML DOM的不同部位做不同的「查找/替換」。我曾希望像下面的東西可以工作,但DOMXPath不能使用DOMDocumentFragment :(

下面的例子的第一部分(直到foreach循環)像一個魅力。我正在尋找替代靈感路要走周圍這仍然是短期和可讀(不得多鍋爐板)

代碼:

<?php 
$dom = new DOMDocument; 
$dom->loadXml(file_get_contents('container.xml')); 
$payload = $dom->getElementsByTagName('Payload')->item(0); 

xml_search_replace($dom, array('//MessageReference' => 'SRV4-ID00000000001')); 

$payloadXmlTemplate = file_get_contents('payload_template.xml'); 
foreach (array(array('id' => 'some_id_1'), 
       array('id' => 'some_id_2')) as $request) { 
    $fragment = $dom->createDocumentFragment(); 
    $fragment->appendXML($payloadXmlTemplate); 
    xml_search_replace($fragment, array('//PayloadElement' => $request['id'])); 

    $payload->appendChild($fragment); 
} 
+0

這不是一個真正的問題。也許它更適合[codereview](http://codereview.stackexchange.com)。我不確定你爲什麼需要這裏的文檔片段。如果你想爲你的查詢定義一個上下文,['query'需要一個上下文節點參數](http://php.net/manual/en/domxpath.query.php)。 –

+0

我不知道codereview對不起......但你的建議正是我所尋找的洞察力。從來沒有真正在PHP中使用XML,並且新類的數量有點過大。如果你把它作爲答案,我會選擇。 – Jacob

回答

0

感謝弗朗西斯阿維拉我想出了以下內容:

<?php 
function xml_search_replace($node, $search_replace_rules) { 
    if (!is_array($search_replace_rules)) { 
     return; 
    } 

    $xp = new DOMXPath($node->ownerDocument); 

    foreach ($search_replace_rules as $search_pattern => $replacement) { 
     foreach ($xp->query($search_pattern, $node) as $matchingNode) { 
      $matchingNode->nodeValue = $replacement; 
     } 
    } 
} 

$dom = new DOMDocument; 
$dom->loadXml(file_get_contents('container.xml')); 
$payload = $dom->getElementsByTagName('Payload')->item(0); 

xml_search_replace($dom->documentElement, array('//MessageReference' => 'SRV4-ID00000000001')); 

$payloadXmlTemplate = file_get_contents('payload_template.xml'); 
foreach (array(array('id' => 'some_id_1'), 
       array('id' => 'some_id_2')) as $request) { 
    $fragment = $dom->createDocumentFragment(); 
    $fragment->appendXML($payloadXmlTemplate); 
    xml_search_replace($payload->appendChild($fragment), 
         array('//PayloadElement' => $request['id'])); 
}