我正在尝试用另一个值替换 xml 节点值的一部分。例如,我的 xml 中有这个节点:
<eerste_kwartier>naam leeg</eerste_kwartier>
或者例如:
<eerste_kwartier>leeg leeg</eerste_kwartier>
在第一个示例中,我想用其他东西替换“leeg”值。在第二个中,我只想用其他东西替换第一个 'leeg' 值。有什么想法我应该怎么做?
提前致谢,
扬蒂门
正确的方法是使用 PHP 的DOMDocument
类来提取您需要的内容。这是一个有效的解决方案:
$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>
对于第二个测试用例,它将输出:
<?xml version="1.0"?> <eerste_kwartier>Something Else leeg</eerste_kwartier>
基本上,您可以通过 PHP 使用 DOM 来实现这一点。
给定这样的字符串中的 XML 格式:
$xml = <<<EOX
<root>
<eerste_kwartier>naam leeg</eerste_kwartier>
<eerste_kwartier>leeg leeg</eerste_kwartier>
</root>
EOX;
您可以执行以下操作:
使用 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();
上面的示例可以很容易地更改为使用 XPath 的 query() 而不是 DOM 的 getElementsByTagName()。
所以你会这样做:
// 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();
您肯定已经注意到这两个选项非常相似。
如果您在文档中的搜索解析为搜索相同的标签名称,我建议您使用选项 1;如果你的搜索应该比这更清晰,我建议选择 2,因为 XPath 有很多很好的武器来对抗 XML 搜索的复杂性(可以在这里找到 XPath 的简要介绍,但是有很多可用的材料谷歌搜索)。
我不会将 XSL 纳入图片,除非您应该对内容应用更高比例和清晰的转换,但以防万一:http ://htmlite.com/XML008.php (一个非常简短的 XSLT 介绍教程,应该满足你的胃口)。
你不能使用 str_replace 函数吗?
$xml = str_replace('<eerste_kwartier>leeg leeg</eerste_kwartier>','<eerste_kwartier>somethingelse leeg</eerste_kwartier>',$xml);