首先,谢谢你的帮助!
我有一个如下所示的xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE tv SYSTEM "xmltv.dtd">
<tv source-info-url="http://tvschedule.zap2it.com/" source-info-name="zap2it.com" generator-info-name="zap2xml" generator-info-url="zap2xml@gmail.com">
<channel id="I16689330.labs.zap2it.com">
<display-name>502 WCBSDT</display-name>
<display-name>502</display-name>
<display-name>WCBSDT</display-name>
<icon src="https://zap2it.tmsimg.com/h3/NowShowing/16689/s28711_h3_aa.png" />
</channel>
<programme start="20180303203000 -0500" stop="20180303230000 -0500" channel="I20453335.labs.zap2it.com">
<title lang="en">NBA Basketball</title>
<sub-title lang="en">Boston Celtics at Houston Rockets</sub-title>
<desc lang="en">From the Toyota Center in Houston.</desc>
<category lang="en">Sports</category>
<category lang="en">Basketball</category>
<length units="minutes">120</length>
<icon src="https://zap2it.tmsimg.com/assets/p14464724_tb2_v5_aa.jpg" />
<url>https://tvlistings.zap2it.com//overview.html?programSeriesId=SP00371600&tmsId=SP003716000000</url>
<episode-num system="dd_progid">SP00371600.0000</episode-num>
<new />
<subtitles type="teletext" />
</programme>
</tv>我想要生成这样的东西,把标题和副标题结合起来:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE tv SYSTEM "xmltv.dtd">
<tv source-info-url="http://tvschedule.zap2it.com/" source-info-name="zap2it.com" generator-info-name="zap2xml" generator-info-url="zap2xml@gmail.com">
<channel id="I16689330.labs.zap2it.com">
<display-name>502 WCBSDT</display-name>
<display-name>502</display-name>
<display-name>WCBSDT</display-name>
<icon src="https://zap2it.tmsimg.com/h3/NowShowing/16689/s28711_h3_aa.png" />
</channel>
<programme start="20180303203000 -0500" stop="20180303230000 -0500" channel="I20453335.labs.zap2it.com">
<title lang="en">NBA Basketball: Boston Celtics at Houston Rockets</title>
<desc lang="en">From the Toyota Center in Houston.</desc>
<category lang="en">Sports</category>
<category lang="en">Basketball</category>
<length units="minutes">120</length>
<icon src="https://zap2it.tmsimg.com/assets/p14464724_tb2_v5_aa.jpg" />
<url>https://tvlistings.zap2it.com//overview.html?programSeriesId=SP00371600&tmsId=SP003716000000</url>
<episode-num system="dd_progid">SP00371600.0000</episode-num>
<new />
<subtitles type="teletext" />
</programme>
</tv>如果可以用php脚本来完成,那就更好了。
发布于 2018-02-28 04:22:14
因此,如果$string中有XML字符串,则可以使用simplexml_load_string将其解析为XML对象。
$xml = simplexml_load_string($string);然后以对象属性的形式访问元素:
> echo $xml->title;
NBA Basketball要构建您想要的组合属性,它就像直觉一样(请注意必须如何处理破折号特殊字符):
$xml->title .= ': '.$xml->{'sub-title'};因为我们已经将子标题属性组合成标题,所以我们不再需要它:
unset($xml->{'sub-title'});然后打印出整个物体:
> echo $xml->asXML();
<?xml version="1.0"?>
<programme start="20180303203000 -0500" stop="20180303230000 -0500" channel="I20453335.labs.zap2it.com">
<title lang="en">NBA Basketball: Boston Celtics at Houston Rockets</title>
<desc lang="en">From the Toyota Center in Houston.</desc>
<category lang="en">Sports</category>
<category lang="en">Basketball</category>
<length units="minutes">120</length>
<icon src="https://zap2it.tmsimg.com/assets/p14464724_tb2_v5_aa.jpg"/>
<url>https://tvlistings.zap2it.com//overview.html?programSeriesId=SP00371600&tmsId=SP003716000000</url>
<episode-num system="dd_progid">SP00371600.0000</episode-num>
<new/>
<subtitles type="teletext"/>
</programme>示例完成执行:
<?php
$string = file_get_contents('xmltv.xml');
$xml = simplexml_load_string($string);
$xml->title .= ': '.$xml->{'sub-title'};
unset($xml->{'sub-title'});
file_put_contents('xmltv.xml', $xml->asXML());
?>发布于 2018-03-01 14:44:51
或者,考虑XSLT,这是一种专门用于转换XML文件的语言。PHP可以使用它的php-xsl类运行XSLT1.0(确保在.ini文件中启用了它)。而且,XSLT是可移植的,并且不需要PHP来运行它。大多数其他语言(Java、Python、Perl、VB)都可以运行这样的脚本,甚至可以运行独立的XSLT处理器。
具体来说,在XSLT脚本下面运行标识转换复制文档原样,然后用标题和字幕的concat()重写程序节点,最后复制所有其他节点和属性。虽然这看起来有些过分,但是如果您的XML要大得多,并且维护了许多程序节点,这个XSLT将将所有标题和子标题组合在一起,而不需要任何循环。
XSLT (另存为.xsl文件,一个特殊的.xml文件)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- IDENTITY TRANSFORM -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- REWRITE PROGRAMME -->
<xsl:template match="programme">
<xsl:copy>
<xsl:copy-of select="@*"/>
<title><xsl:value-of select="concat(title, ' ', sub-title)" /></title>
<xsl:apply-templates select="*[name()!='title' and name()!='sub-title']" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>$xml = new DOMDocument;
$xml->load('Input.xml');
$xsl = new DOMDocument;
$xsl->load('XSLT_Script.xsl');
// Configure transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
// Transform XML source
$newXML = new DOMDocument;
$newXML = $proc->transformToXML($xml);
// Output to console
echo $newXML;
// Output to file
file_put_contents('Output.xml', $newXML);输出
<programme start="20180303203000 -0500" stop="20180303230000 -0500" channel="I20453335.labs.zap2it.com">
<title>NBA Basketball Boston Celtics at Houston Rockets</title>
<desc lang="en">From the Toyota Center in Houston.</desc>
<category lang="en">Sports</category>
<category lang="en">Basketball</category>
<length units="minutes">120</length>
<icon src="https://zap2it.tmsimg.com/assets/p14464724_tb2_v5_aa.jpg"/>
<url>https://tvlistings.zap2it.com//overview.html?programSeriesId=SP00371600&tmsId=SP003716000000</url>
<episode-num system="dd_progid">SP00371600.0000</episode-num>
<new/>
<subtitles type="teletext"/>
</programme>https://stackoverflow.com/questions/49021329
复制相似问题