1

XML ノード値の一部を別の値に置き換えようとしています。たとえば、xml に次のノードがあります。

<eerste_kwartier>naam leeg</eerste_kwartier>

または例:

<eerste_kwartier>leeg leeg</eerste_kwartier>

最初の例では、'leeg' 値を別のものに置き換えたいと考えています。2番目では、最初の「足」の値を別のものに置き換えたいだけです。これをどのように行うべきかについてのアイデアはありますか?

前もって感謝します、

ヤン・ティーメン

4

3 に答える 3

1

DOMDocumentこれを行う適切な方法は、必要なものを抽出するためにPHP のクラスを使用することです。これが実用的な解決策です:

$str = '<eerste_kwartier>naam leeg</eerste_kwartier>';

$doc = new DOMDocument();
$fragment = $doc->createDocumentFragment();
$fragment->appendXML( $str);
$doc->appendChild( $fragment);

$xpath = new DOMXPath( $doc);
$node = $xpath->query( '/eerste_kwartier')->item(0);

$text = $doc->createTextNode( $node->textContent);
$node->nodeValue = ''; // Clear out the contents of the tag

// Get the text before and after the replacement
$start = strpos( $text->wholeText, 'leeg');
$before = $text->substringData( 0, $start);
$after = $text->substringData( $start + strlen( 'leeg'), strlen( $text->wholeText));

// Put the text back, minus the replacement, with something else added
$node->appendChild( $doc->createTextNode( trim( $before)));
$node->appendChild( $doc->createTextNode( "Something Else"));
$node->appendChild( $doc->createTextNode( $after));

echo htmlentities( $doc->saveXML());

これは出力します

<?xml version="1.0"?> <eerste_kwartier>naam Something Else</eerste_kwartier> 

2 番目のテスト ケースでは、次のように出力されます。

<?xml version="1.0"?> <eerste_kwartier>Something Else leeg</eerste_kwartier> 
于 2012-07-03T12:37:43.780 に答える
0

基本的に、DOM を使用して PHP でこれを実現できます。

次のような文字列の XML 形式が与えられます。

    $xml = <<<EOX
<root>    
  <eerste_kwartier>naam leeg</eerste_kwartier>
  <eerste_kwartier>leeg leeg</eerste_kwartier>
</root>
EOX;

次のことができます。

1 - PHP と DOM を使用する

DOM を使用すると、getElementsByTagName() メソッドで同じタグ名を持つ要素のリストを取得し、そのリストを調べて、好みのテキスト変換を適用できます。

例:

// Load source XML
$xmlObj = new DOMDocument("1.0", "UTF-8");
$xmlObj->loadXML($xml);

// Obtain interesting nodes into a node list object
$nodeList = $xmlObj->getElementsByTagName('eerste_kwartier');

// Prepare destination XML object
$xmlObjResult = new DOMDocument("1.0", "UTF-8");
$rootElement = $xmlObjResult->createElement("root");

// Walk node list
for ($i = 0; $i < $nodeList->length; $i++) {
  $tmp = $nodeList->item($i)->nodeValue;
  // Use regular expressions for greater flexibility in selecting text to replace
  $tmp = preg_replace('/naam/', 'leeg', $tmp);
  // Prepare destination element
  $eerste_kwartier = $xmlObjResult->createElement("eerste_kwartier");
  $cdata = $xmlObjResult->createCDATASection($tmp);
  $eerste_kwartier->appendChild($cdata);
  $rootElement->appendChild($eerste_kwartier);
}

// Append root element to the document
$xmlObjResult->appendChild($rootElement);

// Enjoy your XML
echo $xmlObjResult->saveXML();

2 - PHP と DOMXPath を使用する

上記の例は、DOM の getElementsByTagName() の代わりに XPath の query() を使用するように簡単に変更できます。

したがって、次のようにします。

// Load source XML
$xmlObj = new DOMDocument("1.0", "UTF-8");
$xmlObj->loadXML($xml);

// Obtain interesting nodes into a node list object
$xpath = new DOMXPath($xmlObj);
$nodeList = $xpath->query("//eerste_kwartier");

// Prepare destination XML object
$xmlObjResult = new DOMDocument("1.0", "UTF-8");
$rootElement = $xmlObjResult->createElement("root");

// Walk node list
for ($i = 0; $i < $nodeList->length; $i++) {
  $tmp = $nodeList->item($i)->nodeValue;
  // Use regular expressions for greater flexibility in selecting text to replace
  $tmp = preg_replace('/naam/', 'leeg', $tmp);
  // Prepare destination element
  $eerste_kwartier = $xmlObjResult->createElement("eerste_kwartier");
  $cdata = $xmlObjResult->createCDATASection($tmp);
  $eerste_kwartier->appendChild($cdata);
  $rootElement->appendChild($eerste_kwartier);
}

// Append root element to the document
$xmlObjResult->appendChild($rootElement);

// Enjoy your XML
echo $xmlObjResult->saveXML();

結論

お気づきのとおり、2 つのオプションは非常に似ています。

ドキュメント内の検索が同じタグ名の検索に解決される場合は、オプション 1 を使用することをお勧めします。XPath には複雑な XML 検索に対抗するための優れた武器がたくさんあるため、検索をそれよりも少しでも明確にする必要がある場合は、オプション 2 をお勧めします (XPath の簡単な紹介はここにありますが、利用可能な資料はたくさんあります。ぐるぐる回る)。

コンテンツのより高いスケールと明確な変換を適用する必要がない限り、私は XSL を理解することはしませんが、念のため:食欲をそそります)。

于 2012-07-03T13:40:30.897 に答える
-1

str_replace 関数を使用できませんか?

$xml = str_replace('<eerste_kwartier>leeg leeg</eerste_kwartier>','<eerste_kwartier>somethingelse leeg</eerste_kwartier>',$xml);
于 2012-07-03T12:31:01.673 に答える