在 PHP 7.x 中使用 xpath 访问特定的 XML 元素

Accessing a specific XML element using xpath in PHP 7.x

好的,我有一些 XML 数据。

$mydata = <<<XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE fmresultset PUBLIC "-//FMI//DTD fmresultset//EN" "https://HIDDEN:443/fmi/xml/fmresultset.dtd">
<fmresultset xmlns="http://www.filemaker.com/xml/fmresultset" version="1.0">    
    <resultset count="1" fetch-size="1">
        <record mod-id="27" record-id="754">
            <field name="a_Constant_c">
                <data>1</data>
            </field>
            <field name="a_Sch_ID_pk">
                <data>100060</data>
            </field>
            <field name="a_SchoolHead_pk">
                <data>100060_1</data>
            </field>
            <field name="b___Data_____________">
                <data/>
            </field>
            <field name="b_1Name_School_Code_t">
                <data>PJA</data>
            </field>
            <field name="b_1Name_School_t">
                <data>Palmetto</data>
            </field>
            <field name="b_1Name_SchoolHead_t">
                <data>John Doe</data>
            </field>
            <field name="b_Ad_Address1_t">
                <data/>
            </field>
            <field name="b_Ad_Address2_t">
                <data>123 Main St.</data>           
        </record>
    </resultset>
</fmresultset>
XML;

现在我想做的基本上是能够从特定字段读取数据的值并将其分配给变量。

到目前为止我有这样的东西...

$xml = simplexml_load_string($mydata);

现在我希望能够分配字段名称中的数据 b_1Name_School_Code_t(即 PJA)

所以我觉得应该是这样的

$school = $xml->resultset->record->field->data;
echo "School Name: ".$school;

那我想在屏幕上看到

School Name: PJA

那么我缺少什么才能实现这一目标?

您只能到达示例中的第一个 field 元素,这就是您得到 1 的原因。相反,遍历所有 field 元素,并在到达所需元素时停止:

$xml = simplexml_load_string($mydata);
$fields = $xml->resultset->record->field;
foreach ($fields as $field) {
    if ((string) $field->attributes()->name === "b_1Name_School_Code_t") {
        echo "School name: ".$field->data; // School name: PJA
        break;
    }
}

Demo

我使用 SimpleXMLElement::attributes() 来获取元素的 name 属性(注意转换为 string,否则你会得到一个 SimpleXMLElement

但是,使用 XPath 直接转到您要查找的元素会更有意义:

$xml = simplexml_load_string($mydata);
$xml->registerXPathNamespace("fmresultset", "http://www.filemaker.com/xml/fmresultset");
$node = $xml->xpath("//fmresultset:resultset/fmresultset:record/fmresultset:field[@name='b_1Name_School_Code_t']");
var_dump($node[0]->data); // PJA

Demo

注意命名空间的注册和第一个元素的访问,因为xpath() returns一个SimpleXMLElements[=25的数组=]