douyigua5381 2013-07-26 05:31
浏览 137

在PHP中替换和修改XML节点

Here's a sample XML structure:

<Products>
    <Product>
        <Id>1</Id>
        <Name>Product 1</Name>
        <Category>MEN</Category>
        <Category>Women</Category>
    <Product>
    <Product>
        <Id>2</Id>
        <Name>Product 2</Name>
        <Category>MEN2</Category>
        <Category>Women2</Category>
    <Product>
</Products>

And I want the file like this:

<Products>
    <Product>
        <Id>1</Id>
        <Name>Product 1</Name>
        <CategoryName>MEN:Women</CategoryName>
    <Product>
    <Product>
        <Id>2</Id>
        <Name>Product 2</Name>
        <CategoryName>MEN:Women</CategoryName>
    <Product>
</Products>

So basically it will search through the nodes in products. If it finds "Category", it will change the name to "CategoryName" and concatenate all the sub-sequent category node values into a single one separated by semicolon.

So I have wrote this small PHP, but not sure how to get this to work.

<?php
    $xmlFile = "test.xml" //assume the contents are in the file
    $xml = simplexml_load_file($xmlFile);

    foreach($xml as $item)
    {
        $name = $item->Product;
        if($name->count()) //check if its a "product" node
        {
            foreach($item as $i)
            {
                $category = $i->Category;
            }
        }
     }
?> 

Can someone point me to the right direction? I haven't much worked with XML.

  • 写回答

3条回答 默认 最新

  • douqiju2520 2013-07-26 05:59
    关注

    Try this:

    $xml = '<Products>
        <Product>
            <Id>1</Id>
            <Name>Product 1</Name>
            <Category>MEN</Category>
            <Category>Women</Category>
        </Product>
        <Product>
            <Id>2</Id>
            <Name>Product 2</Name>
            <Category>MEN2</Category>
            <Category>Women2</Category>
        </Product>
    </Products>';
    
    $dom = new DOMDocument();
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->loadXML( $xml, LIBXML_NOBLANKS );
    
    $xpath = new DOMXPath( $dom );
    
    $ProductNode = $xpath->query( "//Product" );
    
    if( $ProductNode->length ) {
        foreach ( $ProductNode as $node ) {
            $category = $node->getElementsByTagName( 'Category' );
            $str = '';
                // store a reference to the nodes,
                // so that they can be deleted later
            $del = array();
    
            foreach ( $category as $p ) {
                $str .= $p->nodeValue . ':';
                $del[] = $p;
            }
    
            $str = trim( $str, ':' );
    
            $child = $dom->createElement( 'CategoryName', $str );
            $node->appendChild( $child );
    
            foreach ( $del as $p ) {
                $p->parentNode->removeChild( $p );
            }
        }
    }
    
    header('content-type: text/xml');
    echo $dom->saveXML();
    

    Hope it helps.

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)