【问题标题】:Accessing a specific XML element using xpath in PHP 7.x在 PHP 7.x 中使用 xpath 访问特定的 XML 元素
【发布时间】:2018-08-04 02:34:35
【问题描述】:

好的,我有一些 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

那么我缺少什么能够做到这一点?

【问题讨论】:

  • 您的代码中没有 Xpath 调用。你在找SimpleXMLElement::xpath()吗?

标签: php xml xpath simplexml


【解决方案1】:

您只能访问示例中的第一个 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()返回一个SimpleXMLElements的数组

【讨论】:

  • 这正是我想要的。谢谢。
  • 太棒了!你最终使用了哪种方式?
  • 我不确定,但我想我会使用第一个。原因是这只是一所学校。我在这里的示例中只使用了一所学校,但在真正的 XML 中,它是对 FM 数据库的调用,它返回许多学校,因此 中将有多个 元素,所以我认为循环遍历它可能效果最好。
猜你喜欢
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
相关资源
最近更新 更多