xml_parser提取属性

时间:2013-12-17 13:17:34

标签: php xml sax

我想知道是否可以转换此XML

<url name="profile_link">http://example.com/profile/2345/</url>

进入此HTML

<a href="http://example.com/profile/2345/">http://example.com/profile/2345/</a>

使用PHP XML Parser

我不明白如何填充链接中的href。可以通过xml_set_character_data_handler()访问URL(即数据内容),但是在触发该事件之前已经调用了启动处理程序(与锚交换url)。

1 个答案:

答案 0 :(得分:1)

以下是两种方法:

使用DOM

替换节点

更换节点需要较少的引导程序。它完全在PHP中完成。

$xml = <<<'XML'
<url name="profile_link">http://example.com/profile/2345/</url>
XML;

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);

$nodes = $xpath->evaluate('//url');
foreach ($nodes as $node) {
  $link = $dom->createElement('a');
  $link->appendChild($dom->createTextNode($node->textContent));
  $link->setAttribute('href', $node->textContent);
  $node->parentNode->insertBefore($link, $node);
  $node->parentNode->removeChild($node);
}

var_dump($dom->saveXml($dom->documentElement));

使用XSLT转换XML

第二种方法需要XSLT模板文件。 XSLT是一种用于转换XML的语言。因此,初始引导程序更大,但实际转换更容易定义。如果你还需要进行其他转换,我会建议这种方法。

$xml = <<<'XML'
<url name="profile_link">http://example.com/profile/2345/</url>
XML;

$xsl = <<<'XSL'
<?xml version="1.0"?>
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="url">
  <a href="text()">
    <xsl:value-of select="text()"/>
  </a>
</xsl:template>

<!-- pass through for unknown tags in the xml tree -->
<xsl:template match="*">
  <xsl:element name="{local-name()}">
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates select="node()"/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>
XSL;

$dom = new DOMDocument(); 
$dom->loadXml($xml); 

$xslDom =  new DOMDocument();
$xslDom->loadXml($xsl);

$xsltProc = new XsltProcessor();
$xsltProc->importStylesheet($xslDom);

$result = $xsltProc->transformToDoc($dom);

var_dump($result->saveXml($result->documentElement));