简单的 XML Xpath 查询问题

发布于 2024-12-10 06:57:25 字数 694 浏览 1 评论 0原文

对于在 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"]”给了我无效的表达式错误。

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

Completely new to using simple XML library in PHP, and have been using the w3 xpath syntax for assistance.

I have an xml file that looks roughly like this:

<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>

I'm trying to figure out which module has the Front_Name of b. Right now I've only been trying to get just the attribute to match, not caring about getting the parent, and here's what I've tried:

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

That gets me nothing, however: "/Xml_Configs/*/Front_Name" does give me an array of simple xml objects with a, b, and c. And "/Xml_Configs/*/[@Front_Name="b"]" gives me invalid expression errors.

Any help you can give is appreciated, thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

两相知 2024-12-17 06:57:25

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

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

 那对我来说一无所获

的,因为顶部元素 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>

I建议您获取XPath Visualizer -帮助成千上万的开发人员在享受乐趣的同时学习 XPath 的工具 同时。

I'm trying to figure out which module has the Front_Name of b

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

 That gets me nothing

Yes, because none of the elements that are children of the top element Xml_Configs have any attributes.

You want:

/*/*[Front_Name = 'b']

This selects all children of the top element that have a child named Font_Name with string value "b".

XSLT - based verification:

<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>

when this transformation is applied on the provided XML document:

<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>

it copies to the output the selected node:

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

I would recommend that you obtain the XPath Visualizer -- a tool that has helped thousands of developers learn XPath while having fun at the same time.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文