无法访问 XML 节点中的@attributes

Unable to Access @attributes in XML Node

我正在尝试访问以下 XML 中 'criteria' 节点中的 'field' 元素:

<?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,请查看 the examples in the manual。使用 ->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>";
}