无法访问 XML 节点中的@attributes



>我正在尝试访问以下XML中"criteria"节点中的"字段"元素:

<?xml version="1.0" encoding="utf-8"?>
<result>
    <product>
        <data>
            <field>spr_tech1</field>
            <value>S7</value>
            <criteria field="xfield_3">
                <criteria_list>Green</criteria_list>
                <criteria_list>Beige</criteria_list>
            </criteria>
        </data>
        <data>
            <field>spr_tech1</field>
            <value>S1</value>
            <criteria field="xfield_3">
                <criteria_list>Red</criteria_list>
                <criteria_list>Blue</criteria_list>
                <criteria_list>Yellow</criteria_list>
            </criteria>
        </data>
        <data>
            <field>spr_tech1</field>
            <value>S7</value>
            <criteria field="xfield_3">
                <criteria_list>Green</criteria_list>
            </criteria>
            <criteria field="tech_rt2">
                <criteria_list>Transistor</criteria_list>
            </criteria>
        </data>
    </product>
</result>

下面的代码导致以下错误:致命错误:调用非对象上的成员函数 attributes()

function parseXmlFile($filename)
{
    $xml = file_get_contents($filename);
    $obj = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
    $array = json_decode(json_encode($obj), true); // Convert to array}
    return $array;
}
$xform = parseXmlFile('transformations.xml');
foreach ($xform['product']['data'] as $data)
{
    echo (string)$data['field'] . '<br>';
    echo (string)$data['value'] . '<br>';
    foreach($data['criteria']->attributes() as $att => $val)
    { echo $att . ' = ' . $val . '<br>'; }
    echo $data['criteria']->attributes()->{'field'} . '<br>';
    foreach($data['criteria']['criteria_list'] as $att => $val)
    { echo $att . ' = ' . $val . '<br>'; }
    echo "-----------------------------------<br>";
}
print "<pre>";
print_r($xform);
print "</pre>";

正如您在代码中看到的那样,我已经尝试了几种方法,但这两种方法都不适合我。

任何帮助不胜感激!

似乎问题出在您加载文件时。我试过file_get_contents()见下文

$xml_content = file_get_contents('path to your XML file');
$xform = simplexml_load_string($xml_content);
foreach ($xform['product']['data'] as $data)
{
    echo (string)$data['field'] . '<br>';
    echo (string)$data['value'] . '<br>';
    foreach($data['criteria']->attributes() as $att => $val)
    { echo $att . ' = ' . $val . '<br>'; }
    echo $data['criteria']->attributes()->{'field'} . '<br>';
    foreach($data['criteria']['criteria_list'] as $att => $val)
    { echo $att . ' = ' . $val . '<br>'; }
    echo "-----------------------------------<br>";
}
print "<pre>";
print_r($xform);
print "</pre>";

您的parseXmlFile函数可以完全替换为内置simplexml_load_file()

  • 它首先加载内容file_get_contents; simplexml_load_file vs simplexml_load_string会为你做到这一点
  • 它强制使用 LIBXML_NO_CDATA 选项,这几乎肯定不是您需要的;要获取 SimpleXML 对象(包括 CDATA)的文本内容,您需要使用(string)$node
  • 它将非常有用的 SimpleXML 对象转换为一个数组,该数组将缺少一半的数据,并且使用起来要糟糕得多

要理解 SimpleXML,请查看手册中的示例。元素使用 ->name 访问,属性使用 ['name'] 访问。

所以:

$xform = simplexml_load_file('transformations.xml');
foreach ($xform->product->data as $data)
{
    echo (string)$data->field . '<br>';
    echo (string)$data->value . '<br>';
    foreach($data->criteria->attributes() as $att => $val)
    { echo $att . ' = ' . $val . '<br>'; }
    echo $data->criteria['field'] . '<br>';
    foreach($data->criteria->criteria_list as $number => $node)
    { echo $number . ' = ' . (string)$node . '<br>'; }
    echo "-----------------------------------<br>";
}

最新更新