0

我正在通过 API 获取一些数据,它以以下形式返回 XML:

<SUBSCRIBER_ROW>
<SUBSCRIBER>
    <ACCOUNT_NUMBER Value="0123456789123"/>
    <FIRST_NAME Value="fakeFirstName         "/>
    <INITIAL Value="w "/>
    <SURNAME Value="fakeLastName        "/>
    <TELEPHONE_NUMBER Value="5551234"/>
    <TELEPHONE_AREA Value="403"/>

我必须提取数据的代码如下:

   protected function par_getSubscriber($webCBSXML, $isJSON = false){
  ////parse XML
    $msg = 'WebCBS ERR: ';
    $dom = new DOMDocument();
    if(@$dom->loadXML($webCBSXML)) {
        $errors = $dom->getElementsByTagName('Error');
        if($parsedData = self::checkError($dom)) {
            $parsedData = self::formatOutput($parsedData, $isJSON, true);
            return $parsedData;
        } else {
            $subscriber['account_number']      = $dom->getElementsByTagName('account_number')->getAttribute('Value');
            $subscriber['first_name']          = $dom->getElementsByTagName('first_name')->getAttribute('Value');
            $subscriber['surname']             = $dom->getElementsByTagName('surname')->getAttribute('Value');
            $subscriber['telephone_number']    = $dom->getElementsByTagName('telephone_number')->getAttribute('Value');

但是,整个脚本在这一行之后就死了:

$subscriber['account_number']      = $dom->getElementsByTagName('account_number')->getAttribute('Value');

我没有太多处理 DOM 文档的经验,因为它是从 XML 创建一个对象,所以我无法使用 var_dump/print_r 来查看它的结构!

4

1 回答 1

1

虽然我会建议使用 XPath 来提取您需要的信息,但似乎您只是误解了getElementsByTagName(). 它返回一个 DOMNodeList 而不是单个节点。此外,您还必须将提到的@salathe 节点名称大写。将代码更改为:

$subscriber['account_number'] =
    $dom->getElementsByTagName('ACCOUNT_NUMBER')->item(0)->getAttribute('Value');

此外,您应该检查节点是否真的存在于 XML 中。您可以用 PHP 编写检查,也可以使用 XSD 等模式语言。

于 2013-01-07T23:41:25.843 回答