【问题标题】:How to show information about the selected Engineering Tools using xPath in PHP如何在 PHP 中使用 xPath 显示有关所选工程工具的信息
【发布时间】:2020-12-01 10:11:56
【问题描述】:

大家好。

我正在开发一个非常简单的应用程序,我想实现一些允许用户从下拉菜单中选择工具的功能,单击提交按钮后,它将通过提取显示所选工具的信息XML 文件中的信息。

我通过从 XML 文件中提取工具名称来创建下拉菜单:

<form method="POST" action="showspecifictool.php">
<select id="choose" name="choose">
    <?php
        $tools = simplexml_load_file('tools.xml');
        foreach($tools as $tool) {
            echo "<option value='test'>".$tool->name."</option>";
        }
    ?>
</select>
<input type="submit" name="submit" add="choose">

下一步将使用 XPath 显示从下拉菜单中选择的工具的所有信息,但我不太确定如何处理,非常感谢您的帮助!

我的 tools.xml 看起来像这样:

<tool type="learning" web-based="True" free="True">
    <name>...</name>
    <description>...</description>
    <url>...</url>
    <subjects>...</subjects>
    <creators>...</creators>
    <category>...</category>
    <price>...</price>
</tool>

【问题讨论】:

  • 鉴于您所拥有的,您需要构造一个有效的 xpath 查询来选择该工具。你试过那种吗?示例:stackoverflow.com/a/48573659
  • 虽然我建议为每个工具找到一个唯一的密钥(例如 uuid)并改用它。
  • 我做到了,但不幸的是我无法让它工作,因为它显示一个空的输出。 :(
  • 这是一个简单的例子:3v4l.org/NL9Wd 虽然我不太确定如何回答您的问题,因为您的问题中缺少选择和显示所选工具的方法的整个部分。
  • 嗯,那是因为那是我正在努力的部分。 :) 我有一个显示工具名称的简单下拉菜单,在选择工具并单击提交按钮后,它将重定向到显示有关所选工具的所有信息的下一页。

标签: php xml xpath


【解决方案1】:

Xpath 表达式允许您使用位置路径和条件从 DOM 中获取节点。您需要数据中的唯一值。 id 效果最好,但我们假设名称是唯一的。

$_REQUEST['tool'] = 'Tool A';

$selectedToolName = str_replace(['"', "'"], '', $_REQUEST['tool'] ?? '');
$tools = new SimpleXMLElement(getXML());
?>
<form method="GET" action="showspecifictool.php">
<select id="choose" name="choose">
    <?php
        foreach($tools as $tool) {
            printf(
                '<option value="%1$s"%2$s>%1$s</option>',
                htmlspecialchars($tool->name),
                $selectedToolName  === $tool->name ? ' selected' : ''
            );
        }
    ?>
</select>
<input type="submit" name="submit" add="choose">
<?php

foreach($tools->xpath("(tool[name = '{$selectedToolName}'])[1]") as $tool) {
    var_dump((string)$tool->name);
}

输出:

<form method="GET" action="showspecifictool.php">
<select id="choose" name="choose">
    <option value="Tool A" selected>Tool A</option></select>
<input type="submit" name="submit" add="choose">
string(6) "Tool A"

Xpath 表达式获取$tools 上下文节点的tool 子元素。 tool[name = 'Tool A'] 添加特定 name 的条件。 (tool[name = 'Tool A'])[1] 将结果限制为第一个找到的节点。

在 DOM 中你需要更多的 Xpath 表达式:

$_REQUEST['tool'] = 'Tool A';

$selectedToolName = str_replace(['"', "'"], '', $_REQUEST['tool'] ?? '');
$document = new DOMDocument();
$document->loadXML(getXML());
$xpath = new DOMXpath($document);

?>
<form method="GET" action="showspecifictool.php">
<select id="choose" name="choose">
    <?php
        foreach($xpath->evaluate('/*/tool') as $tool) {
            $toolName = $xpath->evaluate('string(name)', $tool);
            printf(
                '<option value="%1$s"%2$s>%1$s</option>',
                htmlspecialchars($toolName),
                $selectedToolName  === $toolName ? ' selected' : ''
            );
        }
    ?>
</select>
<input type="submit" name="submit" add="choose">
<?php

foreach($xpath->evaluate("(/*/tool[name = '{$selectedToolName}'])[1]") as $tool) {
    var_dump(
        $xpath->evaluate('string(name)', $tool)
    );
}

【讨论】:

  • 如果我想显示所选工具的所有信息而不仅仅是它的名称,我该怎么办?因为我希望用户看到他们选择的工具的信息。 (我上面显示的 tools.xml 文件中的所有这些信息)
  • $tool 包含找到的 tool SimpleXMLElement 实例。您可以访问其属性。
  • 很遗憾,我无法让您的代码与我的代码一起使用,但无论如何感谢您的帮助。 :)
  • 此外,将选项标签的文本重复为其value 属性值是没有必要/有益的——只需省略更简洁/更简单标记的属性声明。
  • 我实际上不记得“选项”是这样做的。另外,不记得我上次使用该值作为标题是什么时候了。但是,我认为具有显式值而不是隐式值更具可读性。
猜你喜欢
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多