简单的XML Xpath查询问题

时间:2011-10-15 22:41:44

标签: php xml xpath simplexml

全新使用PHP中的简单XML库,并且一直使用w3 xpath语法提供帮助。

我有一个大致如下的xml文件:

<Xml_Configs>
<Foo_Module>
   <Front_Name>a</Front_Name>
</Foo_Module>
<Bar_Module>
   <Front_Name>b</Front_Name>
</Bar_Module>
<Baz_Module>
   <Front_Name>c</Front_Name>
</Baz_Module>
</Xml_Configs>

我正在试图找出哪个模块的Front_Name为b。现在我只是试图获得匹配的属性,而不是关心获得父母,这就是我尝试过的:

$xmlObj->xpath('/Xml_Configs/*[@Front_Name="b"]');

这对我没有任何帮助,但是:“/ Xml_Configs / * / Front_Name”确实给了我一个带有a,b和c的简单xml对象数组。并且“/ Xml_Configs / * / [@ Front_Name =”b“]”给了我无效的表达错误。

感谢您提供的任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

  

我正在试图找出哪个模块的Front_Name为b

    `$xmlObj->xpath('/Xml_Configs/*[@Front_Name="b"]');`

 That gets me nothing

是的,因为顶级元素Xml_Configs的子元素都没有任何属性。

你想要

/*/*[Front_Name = 'b']

这将选择顶部元素中具有名为Font_Name且字符串值为"b"的子项的所有子元素。

基于XSLT的验证

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select="/*/*[Front_Name = 'b']"/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<Xml_Configs>
    <Foo_Module>
        <Front_Name>a</Front_Name>
    </Foo_Module>
    <Bar_Module>
        <Front_Name>b</Front_Name>
    </Bar_Module>
    <Baz_Module>
        <Front_Name>c</Front_Name>
    </Baz_Module>
</Xml_Configs>

它将所选节点复制到输出

<Bar_Module>
   <Front_Name>b</Front_Name>
</Bar_Module>

我建议您获取the XPath Visualizer - 这个工具可以让数千名开发人员在同时享受乐趣的同时学习XPath。