首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从XML PHP5获取内容

从XML PHP5获取内容
EN

Stack Overflow用户
提问于 2010-03-03 05:31:01
回答 5查看 4.9K关注 0票数 1

我正在开发一个支付解决方案,需要一些PHP的帮助。我正在做一个HTTPRequest,作为响应,我会得到一些XML。XML可能如下所示:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<payer>
    <purchase_list>
            <freeform_purchase>
                <line_number>1</line_number>
                <description>description</description>
                <price_including_vat>12</price_including_vat>
                <vat_percentage>
                    15
                </vat_percentage>
                <quantity>10</quantity>
            </freeform_purchase>
    </purchase_list>
    <payment_urls>
        <auth_url>authurl</auth_url>
        <settle_url>settleurl</settle_url>
    </payment_urls>
</payer>

基本上,我想要做的是从标签中获取内容,并将它们保存在字符串中。

我试过这个:

代码语言:javascript
复制
$order = '<?xml version="1.0" encoding="utf-8" ?>
<payer>
    <purchase_list>
            <freeform_purchase>
                <line_number>1</line_number>
                <description>description</description>
                <price_including_vat>12</price_including_vat>
                <vat_percentage>
                    15
                </vat_percentage>
                <quantity>10</quantity>
            </freeform_purchase>
    </purchase_list>
    <payment_urls>
        <auth_url>authurl</auth_url>
        <settle_url>settleurl</settle_url>
    </payment_urls>
</payer>';

$orderXML = new DOMDocument();
$orderXML->load($order);

$payerXML = $orderXML->getElementsByTagName( 'payer' );
$purchase_listXML = $orderXML->getElementsByTagName( 'purchase_list' );
$freeform_purchaseXML = $orderXML->getElementsByTagName( 'freeform_purchase' );
$linenumberXML = $orderXML->getElementsByTagName( 'line_number' );
$descriptionXML = $orderXML->getElementsByTagName( 'description' );
$price_inc_vatXML = $orderXML->getElementsByTagName( 'price_including_vat' );
$vat_percentageXML = $orderXML->getElementsByTagName( 'vat_percentage' );
$quantityXML = $orderXML->getElementsByTagName( 'quantity' );
$settle_urlXML = $orderXML->getElementsByTagName( 'settle_url' );
$auth_urlXML = $orderXML->getElementsByTagName( 'auth_url' );

$theLineNumber = $linenumberXML->item(0)->nodeValue;
$theValue = $descriptionXML->item(0)->nodeValue;
$freeform_price = $price_inc_vatXML->item(0)->nodeValue;
$freeform_vat = $vat_percentageXML->item(0)->nodeValue;
$freeform_quantity = $quantityXML->item(0)->nodeValue;

$Settle_url = $settle_urlXML->item(0)->nodeValue;
$Auth_url = $auth_urlXML->item(0)->nodeValue;

echo 'thLineNumber - ' . $theLineNumber;
echo $theValue;
echo $freeform_price;
echo $freeform_vat;
echo $freeform_quantity;
echo $Settle_url;
echo $Auth_url;

但显然有些地方不对劲,因为它不会回应任何东西..有什么建议吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-03 05:36:44

如果您只想从XML字符串中读取一些数据,最简单的方法可能是使用SimpleXML,而不是DOM --在编写XML时,DOM非常适合,但是对于读取,SimpleXML要容易得多。

例如,您可以使用下面这样的内容作为起点:

注意,我使用了simplexml_load_string函数来加载XML字符串。

代码语言:javascript
复制
$string = <<<STR
<?xml version="1.0" encoding="utf-8" ?>
<payer>
    <purchase_list>
            <freeform_purchase>
                <line_number>1</line_number>
                <description>description</description>
                <price_including_vat>12</price_including_vat>
                <vat_percentage>
                    15
                </vat_percentage>
                <quantity>10</quantity>
            </freeform_purchase>
    </purchase_list>
    <payment_urls>
        <auth_url>authurl</auth_url>
        <settle_url>settleurl</settle_url>
    </payment_urls>
</payer>
STR;

$xml = simplexml_load_string($string);

echo intval($xml->purchase_list->freeform_purchase->price_including_vat) . '<br />';
echo (string)$xml->payment_urls->auth_url . '<br />';

这将为您提供以下输出:

代码语言:javascript
复制
12
authurl

基本上,在SimpleXML中,XML树可以作为对象使用-- XML的根节点不在树中,因为它是根节点;这就是为什么我不需要包含payer来访问数据。

票数 4
EN

Stack Overflow用户

发布于 2010-03-03 05:35:51

您可能会看到SimpleXML -它比DOMDocument使用起来要简单得多。它将以解析对象的形式返回XML数据,因此您可以执行以下操作:

代码语言:javascript
复制
$order = '<?xml version="1.0" encoding="utf-8" ?>
<payer>
    <purchase_list>
            <freeform_purchase>
                <line_number>1</line_number>
                <description>description</description>
                <price_including_vat>12</price_including_vat>
                <vat_percentage>
                    15
                </vat_percentage>
                <quantity>10</quantity>
            </freeform_purchase>
    </purchase_list>
    <payment_urls>
        <auth_url>authurl</auth_url>
        <settle_url>settleurl</settle_url>
    </payment_urls>
</payer>';

// Alternative version: $xml = new SimpleXMLElement($order);
// (completely equivalent to the below line)
$xml = simplexml_load_string($order);

$vat_pct = intval($xml->purchase_list->freeform_purchase->vat_percentage);
票数 0
EN

Stack Overflow用户

发布于 2010-03-03 05:39:42

尝试使用simplexml_load_string($string);然后像这样对它执行foreach

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

foreach($xml as $item)
{
echo $item->description; // would print the description
// continiu your logic here
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2366933

复制
相关文章

相似问题

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