php xml解析内联节点内联

时间:2015-01-23 15:15:17

标签: php xml

我有一个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;作为(粗体)文本之间的文本?..

3 个答案:

答案 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 被杀。