0

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);
}
4

1 に答える 1

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']));
}
于 2012-10-09T11:25:47.033 に答える