我有一个xml文档,其中包含与文本混合的节点。我想将此节点解析为与现有文本一致的粗体文本。我搜索并研究了网络的答案,但未能找到这样做的方法。我的xml文件如下所示:
<song>
<lyrics>
<verse name="v1">
<lines>
On a <chord name="A"/>hill far away stood an <chord name="D"/>old rugged cross, The <chord name="E7"/>emblem of suff'ring and <chord name="A"/>shame;<br/>
And I <chord name="A"/>love that old cross where the <chord name="D"/>dearest and best, For a <chord name="E7"/>world of lost sinners was <chord name="A"/>slain.
</lines>
</verse>
</lyrics>
</song>
要解析我所做的经文:
$xml = @simplexml_load_file($file) or die("Can't read XML-SONG file...");
$myVerse= $xml->lyrics->verse[0]->lines;
echo $myVerse;
打印:
在远处的一座小山上,矗立着一个古老的崎岖十字架,满足和羞耻的象征;我喜欢那个最亲爱的,最好的旧十字架,因为失去了罪人的世界被杀了。
但是如何解析那些&lt; chord name =“D”/&gt;作为(粗体)文本之间的文本?..
答案 0 :(得分:0)
$xml = @simplexml_load_file($file) or die("Can't read XML-SONG file...");
$myVerse= $xml->lyrics->verse[0]->lines;
$regex='/(<chord name="(.{1,2})"\/>)/';
$replacement = '<B>$2</B> ';
$myVerse= preg_replace($regex,$replacement,$myVerse);
echo $myVerse;
这将输出
在远处的一个 A 山上,站着一个 D 旧的崎岖十字架, E7 标志的后缀和一个耻辱;
您可以修改替换字符串以满足您显示和弦的需要。
答案 1 :(得分:0)
好吧,当打印为echo $ myVerse时,为什么和弦节点没有出现的问题(即使在节点应该能够显示的页面源中)是因为我忘了输出我的$ myVerse asXML()。因此,变量应该像这样改变:
$xml = @simplexml_load_file($file) or die("Can't read XML-SONG file...");
$myVerse= $xml->lyrics->verse[0]->lines;->asXML();
当我们在页面中打印它时,我们可以在页面源中看到节点
echo $myVerse;
只有这样我们才能像@greg_diesel建议的那样替换节点:
$regex='/(<chord name="(.{1,2})"\/>)/';
$replacement = '<B>$2</B> ';
$myVerse= preg_replace($regex,$replacement,$myVerse);
echo $myVerse;
谢谢@greg_diesel但答案是在 - &gt; asXML() 这项研究帮助我更好地学习了xml,让我希望这也有助于其他人!
答案 2 :(得分:0)
simplexml_load_file根本没有传递你的和弦标签。我在第一篇文章中做了这个假设。 从负载生成的实际XML是
SimpleXMLElement Object
(
[lyrics] => SimpleXMLElement Object
(
[verse] => SimpleXMLElement Object
(
[@attributes] => Array
(
[name] => v1
)
[lines] =>
On a hill far away stood an old rugged cross, The emblem of suff'ring and shame;
And I love that old cross where the dearest and best, For a world of lost sinners was slain
)
)
)
所以我转而使用DOM而且仍然因为它们无效而被删除了和弦标签。我在这个帖子PHP DOM get nodevalue html? (without stripping tags)
中找到了一些帮助我结束了这个。你做了什么。
<?php
function get_inner_html( $node ) {
$innerHTML= '';
$children = $node->childNodes;
foreach ($children as $child) {
$innerHTML .= $child->ownerDocument->saveXML( $child );
}
return $innerHTML;
}
$file='myxmlfile.xml';
$doc = new DOMDocument();
$doc->load($file);
$lines=$doc->getElementsByTagName('lines');
$linesarray=array();
foreach ($lines as $node) {
$linesarray[]=get_inner_html($node);
}
foreach($linesarray as $myVerse){
$regex='/(<chord name="(.{1,2})"\/>)/';
$replacement = '<B>$2</B> ';
$myVerse= preg_replace($regex,$replacement,$myVerse);
echo $myVerse;
}
?>
结果是
在a A 山上,远处是一个 D 旧的崎岖十字架, E7 标志的后缀和 羞耻;
我 A 喜欢 D 最亲爱的老十字架,对于 E7 失去罪人的世界 A 被杀。