【问题标题】:Parsing XML in PHP with special chars in XML在 PHP 中使用 XML 中的特殊字符解析 XML
【发布时间】:2013-02-04 05:57:49
【问题描述】:

我无法解析下面的 XML 以获得我想要的输出。我从 Commission Junction 获取下面的 XML,并且无法控制输出。

<cj-api>
   <advertisers total-matched="609" records-returned="10" page-number="1">
      <advertiser>
         <advertiser-id>2283</advertiser-id>
         <account-status>Active</account-status>
         <seven-day-epc>0.00</seven-day-epc>
         <three-month-epc>1.11</three-month-epc>
         <language>en</language>
         <advertiser-name>
            Name here
         </advertiser-name>
         <program-url>http://website.com/</program-url>
         <relationship-status>joined</relationship-status>
         <mobile-tracking-certified>false</mobile-tracking-certified>
         <network-rank>1</network-rank>
         <primary-category>
            <parent>Financial Services</parent>
            <child>Loans</child>
         </primary-category>
         <performance-incentives>false</performance-incentives>
         <actions>
            <action>
               <name>Sale</name>
               <type>sale</type>
               <id>120</id>
               <commission>
                  <default type="item-level">USD 15.00</default>
               </commission>
            </action>
         </actions>
         <link-types>
            <link-type>Text Link</link-type>
            <link-type>Banner</link-type>
            <link-type>Content Link</link-type>
         </link-types>
      </advertiser>
   </advertisers>
</cj-api>

我正在使用 cURL 发送请求并接收响应。当我打印响应时,我得到了上面的 XML,一切看起来都很好,但是当我尝试解析下面的信息时,当我希望看到“2283”时得到“0”

$xml = simplexml_load_string($response);
print $xml->{"cj-api"}->advertisers->advertiser->advertiser-id;

谁能帮我理解我做错了什么?

为了让我更加高兴,如果有人能告诉我如何将每个元素解析为它自己的变量,我会非常感激。

【问题讨论】:

    标签: php xml parsing


    【解决方案1】:

    这应该可以解决您的问题。

    <?php
    
    $xml_string = <<<XML
    <cj-api>
       <advertisers total-matched="609" records-returned="10" page-number="1">
          <advertiser>
             <advertiser-id>2283</advertiser-id>
             <account-status>Active</account-status>
             <seven-day-epc>0.00</seven-day-epc>
             <three-month-epc>1.11</three-month-epc>
             <language>en</language>
             <advertiser-name>
                Name here
             </advertiser-name>
             <program-url>http://website.com/</program-url>
             <relationship-status>joined</relationship-status>
             <mobile-tracking-certified>false</mobile-tracking-certified>
             <network-rank>1</network-rank>
             <primary-category>
                <parent>Financial Services</parent>
                <child>Loans</child>
             </primary-category>
             <performance-incentives>false</performance-incentives>
             <actions>
                <action>
                   <name>Sale</name>
                   <type>sale</type>
                   <id>120</id>
                   <commission>
                      <default type="item-level">USD 15.00</default>
                   </commission>
                </action>
             </actions>
             <link-types>
                <link-type>Text Link</link-type>
                <link-type>Banner</link-type>
                <link-type>Content Link</link-type>
             </link-types>
          </advertiser>
          <advertiser>
             <advertiser-id>2284</advertiser-id>
             <account-status>Not Active</account-status>
             <seven-day-epc>0.00</seven-day-epc>
             <three-month-epc>1.11</three-month-epc>
             <language>en</language>
             <advertiser-name>
                Name here
             </advertiser-name>
             <program-url>http://website.com/</program-url>
             <relationship-status>joined</relationship-status>
             <mobile-tracking-certified>false</mobile-tracking-certified>
             <network-rank>1</network-rank>
             <primary-category>
                <parent>Financial Services</parent>
                <child>Loans</child>
             </primary-category>
             <performance-incentives>false</performance-incentives>
             <actions>
                <action>
                   <name>Sale</name>
                   <type>sale</type>
                   <id>120</id>
                   <commission>
                      <default type="item-level">USD 15.00</default>
                   </commission>
                </action>
             </actions>
             <link-types>
                <link-type>Text Link</link-type>
                <link-type>Banner</link-type>
                <link-type>Content Link</link-type>
             </link-types>
          </advertiser>
       </advertisers>
    </cj-api>
    XML;
    
    $parse = simplexml_load_string($xml_string);
    foreach($parse->advertisers->advertiser as $advertiser){
        $id = (string) $advertiser->{"advertiser-id"};
        var_dump($id);
    }
    ?>
    

    【讨论】:

    • 优秀。要取出其他元素,我是否只需将它们添加到 foreach 循环中?
    • 是的,您将能够获取所有没有子节点的节点的内容。那些拥有的人将需要另一个foreach 在当前的内部。例如,如果您想获得&lt;link-types&gt;,则必须使用$links = array(); foreach($advertiser-&gt;{"link-types"}-&gt;children() as $link){ $links[] = (string) $link; }。顺便说一句,如果你可以使用JSON 而不是XML 会容易得多。如果您有选择,请使用 JSON。
    • 是的,当他们允许 SOAP 时,JSON 曾经是一个选项。当他们切换到 REST 时,他们也取消了 JSON。
    • 在这种情况下,您必须foreach所有元素和foreach它们的子元素。您也可以尝试使用xpath
    【解决方案2】:
    printf("id is %s", $xml->{"advertisers"}->advertiser->{"advertiser-id"});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2011-01-21
      相关资源
      最近更新 更多