簡體   English   中英

用xpath生成php xml

[英]php xml generation with xpath

我寫了一個小的輔助函數來使用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);
}

感謝弗朗西斯·阿維拉(Francis Avila),我提出了以下建議:

<?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']));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM