php - 在 XML PHP 中添加子项作为列名和列值

标签 php sql xml oracle

我有一个包含此查询的表,我设置了 code=SPEED 和 code=PSTN。在此查询中,我设置了 code=SPEED:

SELECT ID,NAME,xs1 as download, xs2 as upload
  FROM sc_params
  WHERE rfen = 'SERVICE_REQUESTED'
  AND code = 'SPEED' 
  OR code IN
  ( 
    SELECT code 
    FROM sc_params 
    WHERE rfen = 'SERVICE_REQUESTED'
    AND id = (
            SELECT parent 
             FROM sc_params 
             WHERE rfen = 'SERVICE_REQUESTED' 
             AND code = 'SPEED' )
  );

结果是:

ID    NAME       DOWNLOAD    UPLOAD
-----------------------------------
1     Internet   null        null
6     SPEED      1024        256

如果我设置 code=PSTN,结果如下:

 ID    NAME       DOWNLOAD    UPLOAD
 -----------------------------------
 1     VOICE     null        null
 6     PSTN      null        null        

我将此查询添加到 PHP,代码如下:

$serviceName="PSTN, SPEED";    
public function get_xml_product($serviceName) {
            $product    = Array();
            $idx        = -1;
            $explodeResult=explode(", ",$serviceName);
            foreach($explodeResult as $value)
            {
                  $sql = "SELECT id,parent,code,name,xs1, xs2 
                           FROM sc_params
                          WHERE rfen = 'SERVICE_REQUESTED'
                          AND code = '".$value."' 
                            OR code IN
                            ( 
                                SELECT code 
                                 FROM sc_params 
                                 WHERE rfen = 'SERVICE_REQUESTED'
                                 AND id = (
                                SELECT parent 
                                     FROM sc_params 
                                     WHERE rfen = 'SERVICE_REQUESTED' 
                                     AND code = '".$value."' )
                            )";  
                $stmt = oci_parse($this->_conn,$sql);
                $rs = oci_execute($stmt);
                if (!$rs) {
                    $error = oci_error();
                    $this->_err = $error;
                    return false;
                }
                while ($data = oci_fetch_array($stmt, OCI_BOTH)) {
                    if($data['PARENT'] == 0) {
                        $idx++;
                        $idx2 = 0;
                        $product[$idx]['id']        = $data['ID'];
                        $product[$idx]['name']      = $data['NAME'];
                    }
                else {
                    $product[$idx]['download'][$idx2]['name']   = 'DOWNLOAD';
                    $product[$idx]['download'][$idx2]['value'] = $data['DOWNLOAD'];
                    $product[$idx]['upload'][$idx2]['name']   = 'UPLOAD';
                    $product[$idx]['upload'][$idx2]['value'] = $data['UPLOAD'];
                    $idx2++;

                }
            }
//to make xml

        $xml = new SimpleXMLElement("<services/>");
        foreach($product as $key => $value) {
            if (is_array($value)) {
                $subnode = $xml->addChild("service");
                $this->array_to_xml($value, $subnode);
            } else {
               $xml->addChild(htmlspecialchars("$key"),htmlspecialchars("$value"));
            }
        }
        $string = $xml->asXML();
        $result = htmlentities($string);

        oci_free_statement($stmt);
        oci_close($this->_conn);
        return $result;
    }

我也将函数数组制作成 xml,就是这样:

public function array_to_xml($product, &$xml) {
        foreach($product as $key => $value) {
            if (is_array($value)) {
                $subnode = $xml->addChild("service");
                array_to_xml($value, $subnode);
            } else {
               $xml->addChild(htmlspecialchars("$key"),htmlspecialchars("$value"));
            }
        }
        return $xml;
    }

从上面的代码中,我得到了 xml 格式的结果:

<xml version=1.0>
<services>
    <service>
        <id> 2 </id>
        <name> VOICE </name>
    </service>
    <service>
        <id> 1 </id>
        <name> INTERNET </name>
    </service>
</services>

但是,我要显示的结果是这样的:

<?xml version="1.0"?>
         <services>
             <service>
                 <id>1</id>
                 <name>INTERNET</name>
                 <attribute>
                    <name>DOWNLOAD</name>
                    <value>1024</value>
                 </attribute>
                 <attribute>
                    <name>UPLOAD</name>
                    <value>512</value>
                 </attribute>
             </service>
             <service>
                <id>2</id>
                <name>VOICE</name>
             </service>
         </services>

最佳答案

据我了解,您只需传递从有关下载、上传的查询中检索到的信息:

if ($data['PARENT'] == 0) {
        $idx++;
        $idx2 = 0;
        $product[$idx]['id']        = $data['ID'];
        $product[$idx]['name']      = $data['NAME'];
        $product[$idx]['attribute'] = array('name' => 'DOWNLOAD', 'value' => $data['DOWNLOAD']); // <= HERE !
        $product[$idx]['attribute'] = array('name' => 'UPLOAD', 'value' => $data['UPLOAD']); // <= HERE !
    }

关于php - 在 XML PHP 中添加子项作为列名和列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28208566/

相关文章:

javascript - 如何使用 href 调用函数?

php - AJAX POST 发送空格而不是 JSON 对象

php - 通过php导出到excel文件时如何保持mysql数据的格式

mysql - 如何在 SQL 查询中使用 LIKE 运算符返回与值不完全匹配但包含几个单词的数据

mysql - 如何统计单个表中的数据,并合并多个表中的数据?

python - django 的分页在 django View 中是如何工作的

java - “HTML 属性不可序列化”异常 (java)

php - SQL 显示重复条目

java - 为什么键盘向上推可能布局并消失我的标题 android?

java - 如何使用 JDOM 编写和获取同一级别中具有相同名称的所有 xml 元素