【问题标题】:XML edit in phpphp中的XML编辑
【发布时间】:2016-05-16 17:27:10
【问题描述】:

在一个 xml 文件中我有这个结构(<post>repeating):

<data>
<post>
    <deal_id>479</deal_id>
    <deal_title><![CDATA[Δίπλωμα Μηχανής, στη Σχολή Οδηγών Παραστατίδης στον Εύοσμο, μόνο με 49€]]></deal_title>
    <deal_url>http://domain.com/site/shop/autokinito-el/diplwma-mixanis-sxoli-odigwn-parastatidis-euosmos/</deal_url>
    <deal_city><![CDATA[Θεσσαλονίκη]]></deal_city>
    <deal_price><![CDATA[49]]></deal_price>
    <deal_previous_price><![CDATA[125]]></deal_previous_price>
    <deal_discount><![CDATA[60.8]]></deal_discount>
    <deal_start><![CDATA[2016-01-10 00:00:00]]></deal_start>
    <deal_end><![CDATA[2016-04-01 00:00:00]]></deal_end>
    <deal_image>
        <image>
            <file>http://domain.com/site/wp-content/uploads/2015/09/c700x420.jpg</file>
            <title>c700x420</title>
            <caption></caption>
            <description></description>
            <alt></alt>
        </image>
        <image>
            <file>http://domain.com/site/wp-content/uploads/2015/09/diploma1.jpg</file>
            <title>diploma1</title>
            <caption></caption>
            <description></description>
            <alt></alt>
        </image>
    </deal_image>
    <deal_sales><![CDATA[0]]></deal_sales>
    <deal_active><![CDATA[true]]></deal_active></post></data>

我想将&lt;deal_image&gt; 转换为

<deal_image>http://domain.com/site/wp-content/uploads/2015/09/c700x420.jpg</deal_image>

这意味着只保留第一个出现的 jpg 并丢弃其余的..为所有 &lt;post&gt; 执行此操作

我怎样才能用 php 做到这一点?

所以想要的输出应该是这样的:

<data>
<post>
    <deal_id>479</deal_id>
    <deal_title><![CDATA[Δίπλωμα Μηχανής, στη Σχολή Οδηγών Παραστατίδης στον Εύοσμο, μόνο με 49€]]></deal_title>
    <deal_url>http://domain.com/site/shop/autokinito-el/diplwma-mixanis-sxoli-odigwn-parastatidis-euosmos/</deal_url>
    <deal_city><![CDATA[Θεσσαλονίκη]]></deal_city>
    <deal_price><![CDATA[49]]></deal_price>
    <deal_previous_price><![CDATA[125]]></deal_previous_price>
    <deal_discount><![CDATA[60.8]]></deal_discount>
    <deal_start><![CDATA[2016-01-10 00:00:00]]></deal_start>
    <deal_end><![CDATA[2016-04-01 00:00:00]]></deal_end>
    <deal_image>http://domain.com/site/wp-content/uploads/2015/09/c700x420.jpg</deal_image>
    <deal_sales><![CDATA[0]]></deal_sales>
    <deal_active><![CDATA[true]]></deal_active></post></data>

请注意,deal_image 标记仅保留第一张图片的 url,而忽略其余部分。在我的 xml 文件中有很多 &lt;post&gt;&lt;/post&gt; 部分,也应该在迭代中处理。

【问题讨论】:

  • 查看可用于 php 的 xml 库之一。一个简单的就是SimpleXML
  • 我想我已经为您提供了解决方案,但是由于您的问题对我来说并不完全清楚,您可以发布所需输出的示例吗?
  • 我举了一个期望输出的例子以便更好地理解。

标签: php xml


【解决方案1】:

首先我们删除deal_image的所有image子节点,然后我们将图像值分配给deal_image

<?php

$dom = new DOMDocument();
$dom->formatOutput = true;
$dom->loadXML('<data>
<post>
    <deal_id>479</deal_id>
    <deal_title><![CDATA[Δίπλωμα Μηχανής, στη Σχολή Οδηγών Παραστατίδης στον Εύοσμο, μόνο με 49€]]></deal_title>
    <deal_url>http://domain.com/site/shop/autokinito-el/diplwma-mixanis-sxoli-odigwn-parastatidis-euosmos/</deal_url>
    <deal_city><![CDATA[Θεσσαλονίκη]]></deal_city>
    <deal_price><![CDATA[49]]></deal_price>
    <deal_previous_price><![CDATA[125]]></deal_previous_price>
    <deal_discount><![CDATA[60.8]]></deal_discount>
    <deal_start><![CDATA[2016-01-10 00:00:00]]></deal_start>
    <deal_end><![CDATA[2016-04-01 00:00:00]]></deal_end>
    <deal_image>
        <image>
            <file>http://domain.com/site/wp-content/uploads/2015/09/c700x420.jpg</file>
            <title>c700x420</title>
            <caption></caption>
            <description></description>
            <alt></alt>
        </image>
        <image>
            <file>http://domain.com/site/wp-content/uploads/2015/09/diploma1.jpg</file>
            <title>diploma1</title>
            <caption></caption>
            <description></description>
            <alt></alt>
        </image>
    </deal_image>
    <deal_sales><![CDATA[0]]></deal_sales>
    <deal_active><![CDATA[true]]></deal_active></post></data>');
$featuredde1 = $dom->getElementsByTagName('image');
foreach ($featuredde1 as $node) {
    $node->parentNode->removeChild($node);
}
foreach ($featuredde1 as $node) {
    $node->parentNode->removeChild($node);
}
$data = $dom->getElementsByTagName( "deal_image" );
$data ->item(0)->nodeValue = "http://domain.com/site/wp-content/uploads/2015/09/c700x420.jpg";

echo $dom->saveXML();

演示

http://ideone.com/HlrKM4

【讨论】:

  • 谢谢!看起来很棒。但是你有两个foreach。有时有三幅图像或一幅图像。所以这应该计算并循环删除。此外,第一个图像的 url(第一个 &lt;file&gt; 的)应该在删除“图像”标签之前存储在一个临时变量中,然后在 $data -&gt;item(0)-&gt;nodeValue = "..." 中使用,而不是硬编码的 url。因为这整个事情应该处理一个应该加载的整个文件并且包含很多&lt;post&gt; &lt;/post&gt;标签。
  • 不客气。您对我的回答有一个起点,您应该自己开发其余代码。祝你好运。
【解决方案2】:

您可以将DOMDocumentDOMXPath 一起使用:

$dom   = new DOMDocument();
$dom->loadXML( $xml, LIBXML_NOBLANKS );
$xpath = new DOMXPath( $dom );

foreach( $xpath->query( '/data/post/deal_image' ) as $deal_image )
{
    $value     = $xpath->query( './image/file', $deal_image )->item(0)->nodeValue;
    $new_node  = $dom->createElement( 'deal_image', $value );
    $deal_image->parentNode->replaceChild( $new_node, $deal_image );
}

$dom->formatOutput = True;
echo $dom->saveXML().PHP_EOL;

eval.in demo

$xml 是您的 XML 字符串;如果您想直接从文件加载 XML,可以使用 $dom-&gt;load( $filePath ) 代替 $dom-&gt;loadXML( $xml )

DOMDocumentDOMXPath初始化之后,foreach循环检查所有&lt;deal_image&gt;节点,找到第一个&lt;image&gt;&lt;file&gt;的值,用这个找到的值创建一个新的&lt;deal_image&gt;并替换旧的@987654336 @ 与新创建的。

在上面的演示中,我又添加了两个 &lt;post&gt; 来测试使用 1 或 3 个图像的行为。


【讨论】:

    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多