首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在XML文件中组合两个元素

在XML文件中组合两个元素
EN

Stack Overflow用户
提问于 2018-02-28 03:05:18
回答 2查看 703关注 0票数 1

首先,谢谢你的帮助!

我有一个如下所示的xml:

代码语言:javascript
复制
<?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&amp;tmsId=SP003716000000</url>
    <episode-num system="dd_progid">SP00371600.0000</episode-num>
    <new />
    <subtitles type="teletext" />
</programme>
</tv>

我想要生成这样的东西,把标题和副标题结合起来:

代码语言:javascript
复制
<?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&amp;tmsId=SP003716000000</url>
    <episode-num system="dd_progid">SP00371600.0000</episode-num>
    <new />
    <subtitles type="teletext" />
</programme>
</tv>

如果可以用php脚本来完成,那就更好了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-28 04:22:14

因此,如果$string中有XML字符串,则可以使用simplexml_load_string将其解析为XML对象。

代码语言:javascript
复制
$xml = simplexml_load_string($string);

然后以对象属性的形式访问元素:

代码语言:javascript
复制
> echo $xml->title;
NBA Basketball

要构建您想要的组合属性,它就像直觉一样(请注意必须如何处理破折号特殊字符):

代码语言:javascript
复制
$xml->title .= ': '.$xml->{'sub-title'};

因为我们已经将子标题属性组合成标题,所以我们不再需要它:

代码语言:javascript
复制
unset($xml->{'sub-title'});

然后打印出整个物体:

代码语言:javascript
复制
> 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&amp;tmsId=SP003716000000</url>
    <episode-num system="dd_progid">SP00371600.0000</episode-num>
    <new/>
    <subtitles type="teletext"/>
</programme>

示例完成执行:

代码语言:javascript
复制
<?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());
?>
票数 1
EN

Stack Overflow用户

发布于 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文件)

代码语言:javascript
复制
<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>

代码语言:javascript
复制
$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);

输出

代码语言:javascript
复制
<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&amp;tmsId=SP003716000000</url>
  <episode-num system="dd_progid">SP00371600.0000</episode-num>
  <new/>
  <subtitles type="teletext"/>
</programme>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49021329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档