【问题标题】:select whole node with its attribute value too with xpath使用 xpath 选择具有属性值的整个节点
【发布时间】:2016-05-28 14:40:48
【问题描述】:

大家好,我有一个奇怪的问题(对我来说很奇怪)。我有一个 xml 文件 如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<StudentsList>
<Student>
<student_id email="test@yahoo.com">18700</student_id>
<firstName>Jhon</firstName>
<lastName>Smith</lastName>
<address>Dragon Vally china</address>
</Student>
<Student>
<student_id email="LeeSin@gmail.com">18701</student_id>
<firstName>Lee</firstName>
<lastName>Sin</lastName>
<address>League Of Legend UK</address>
</Student>
</StudentsList>

当我在 php 中使用 xpath 搜索该文件时

$allStudents = $xml->xpath("//StudentsList/Student");

它给了我一个数组中的所有学生,他们的子节点和值如下:

Array ( [0] => SimpleXMLElement Object ( [student_id] => 18700 [firstName] => Jhon [lastName] => Smith [address] => Dragon Vally china ) [1] => SimpleXMLElement Object ( [student_id] => 18701 [firstName] => Lee [lastName] => Sin [address] => League Of Legend UK ) [2] => SimpleXMLElement Object ( [student_id] => 18702 [firstName] => Xin [lastName] => Xaho [address] => Shanghi China ) [3] => SimpleXMLElement Object ( [student_id] => 18703 [firstName] => corki [lastName] => adc [address] => flying machine gun china ) [4] => SimpleXMLElement Object ( [student_id] => 18704 [firstName] => Kog [lastName] => Maw [address] => Depth of The Hell ) )

但由于我有一个 student_id 节点的属性,所以我也想获得该属性的值,任何人都可以建议我为此做些什么,我用谷歌搜索了很多,但没有找到正确的答案。他们给出了通过属性值选择父母的例子,但至少我没有找到用整个学生节点选择它的人。

【问题讨论】:

    标签: xml xpath xml-parsing


    【解决方案1】:

    您可以以$element['foo'] 的形式访问名为foo 的属性,例如

    $xml = <<<XML
        <StudentsList>
    <Student>
    <student_id email="test@yahoo.com">18700</student_id>
    <firstName>Jhon</firstName>
    <lastName>Smith</lastName>
    <address>Dragon Vally china</address>
    </Student>
    <Student>
    <student_id email="LeeSin@gmail.com">18701</student_id>
    <firstName>Lee</firstName>
    <lastName>Sin</lastName>
    <address>League Of Legend UK</address>
    </Student>
    </StudentsList>
    XML;
    
    $doc = new SimpleXMLElement($xml);
    
    foreach ($doc->Student as $student) {
        echo $student->student_id['email'] . "\n";
    }
    

    输出两个电子邮件地址,当然使用 XPath 代码是相同的:

    $xml = <<<XML
        <StudentsList>
    <Student>
    <student_id email="test@yahoo.com">18700</student_id>
    <firstName>Jhon</firstName>
    <lastName>Smith</lastName>
    <address>Dragon Vally china</address>
    </Student>
    <Student>
    <student_id email="LeeSin@gmail.com">18701</student_id>
    <firstName>Lee</firstName>
    <lastName>Sin</lastName>
    <address>League Of Legend UK</address>
    </Student>
    </StudentsList>
    XML;
    
    $doc = new SimpleXMLElement($xml);
    
    
    foreach ($doc->xpath("//StudentsList/Student") as $student) {
        echo $student->student_id['email'] . "\n";
    }
    

    【讨论】:

    • 当我必须在 html 表中搜索整个文件时,我可以做到这一点,但是当我在文件中搜索时,我得到了特定学生的记录,我想如何获取它的元素。我通过使用 xpath 得到了一个数组。或者有没有其他方法可以通过 xml 文件进行搜索
    • 好吧,在数组中你有元素节点,当你处理数组或访问数组中的单个元素时,你可以以$student-&gt;student_id 访问子元素,然后以$student-&gt;student_id['email'] 访问属性。查看添加的示例。
    • Martin 谢谢我走近了,但我仍然无法获得我使用的价值 $studen->student_id[0]['email'] 它返回这个,我无法去这个值 SimpleXMLElement对象( [0] => test@yahoo.com )我如何访问该索引?
    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2013-04-26
    • 2012-02-20
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多