在 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;
}
}
我使用 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
注意命名空间的注册和第一个元素的访问,因为xpath()
returns一个SimpleXMLElement
s[=25的数组=]
好的,我有一些 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;
}
}
我使用 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
注意命名空间的注册和第一个元素的访问,因为xpath()
returns一个SimpleXMLElement
s[=25的数组=]