簡體   English   中英

通過 PHP 在 XML<B>數據中搜索<C><B>標簽

[英]Search with PHP in XML <B> Data via <C> tag

首先,我知道已經有一些關於類似事情的問題( 使用 PHP 加載外部 xml 文件搜索 XML 文件 ),但我不能制作任何 PHP,所以以下 (search.php) 是我復制粘貼的在 PHP 中:

<html>
<head>
    <title>Search</title>
</head>
<body>
    <?php
    $search = $_POST["search"];
    $xml=simplexml_load_file("inhaltsverzeichniss.xml") or die("Error: Cannot create object");

    $result = $xml->xpath('//array/entry/tags[.="$search"]');

    while(list( , $node) = each($result)) {
        echo '/array/entry/tags: ',$node,"\n";
    }
    ?>
</body>

然后這是我的 HTML 代碼(以防有人需要它):

<form action="search.php" method="post" >
    <input type="text" name="search" placeholder="search for stuff" >
    <input type="submit" name="search_button" value="Suche" >
</form>

這是我要搜索的 XML 文檔 (inhaltsverzichniss.xml):

<?xml version="1.0" encoding="UTF-8"?>
<array>
  <entry>
    <url>Zeitformen Spanisch.odp</url>
    <name>Zeitformen Tabelle</name>
    <tags>spanisch</tags>
  </entry>
  <entry>
    <url>german-stuff.odt</url>
    <name>etwas Deutsches</name>
    <tags>german</tags>
  </entry>
  <entry>
    <url>something_english.html</url>
    <name>english things</name>
    <tags>english</tags>
  </entry>
  <entry>
    <url>other-data.fileextension</url>
    <name>cool name</name>
    <tags>etc.</tags>
  </entry>
</array>

我想要做的是搜索搜索表單中寫的標簽,並給出整個相應的條目。 (如下所示: <a href"$url">$name</a><br>Tags: $tags

編輯:這是我當前的 XML,其中包含多個標簽的條目(將其更改為“標簽”):

<array>
  <entry>
    <url>spanisch/Zeitformen_Spanisch.ods</url>
    <name>Zeitformen Tabelle</name>
    <tag>spanisch</tag>
  </entry>
  <entry>
    <url>german-stuff.odt</url>
    <name>etwas Deutsches</name>
    <tag>deutsch</tag>
    <tag>spanisch</tag>
    <tag>englisch</tag>
  </entry>
  <entry>
    <url>something_english.html</url>
    <name>english things</name>
    <tag>spanisch</tag>
    <tag>englisch</tag>
  </entry>
  <entry>
    <url>other-data.fileextension</url>
    <name>cool name</name>
    <tag>etc.</tag>
  </entry>
</array>

引用 PHP 手冊:

注意:與雙引號和heredoc 語法不同,特殊字符的變量和轉義序列在出現在單引號字符串中時不會被擴展。

您正在使用單引號

$result = $xml->xpath('//array/entry/tags[.="$search"]');

但單引號會將字符串內容視為文字字符串。 它不會像您認為的那樣插入$search

將您的代碼更改為

$result = $xml->xpath("//array/entry/tags[.='$search']");

它將使用$search而不是文字字符串"$search"

但是,由於您要打印完整的條目元素,因此最好使用此 XPath

$result = $xml->xpath("/array/entry[tags='$search']");

為了可讀性,我更喜歡

$result = $xml->xpath(sprintf('/array/entry[tags="%s"]', $search));

這將為您提供所有<entry>元素,而不是$result中的<tags>元素。 雖然帶有雙斜杠的//array確實有效,但它是不需要的,並且性能比直接路徑差一些。 那是因為無論在文檔中的位置如何,它都會嘗試找到節點。

然后你可以像你要求的那樣打印它:

foreach ($result as $entry) {
    printf(
        '<a href="%s">%s</a><br>Tags: %s%s',
        urlencode($entry->url),
        htmlspecialchars($entry->name),
        htmlspecialchars($entry->tags),
        PHP_EOL
    );
}

關於您對多個標簽元素的編輯:

上面的 XPath 已經可以找到正確的條目。 要顯示所有標簽,您可以更改行

htmlspecialchars($entry->tags),

到(不要忘記調整 xpath 以讀取標簽而不是標簽):

implode_tags($entry->tag),

implode_tags 函數被定義為

function implode_tags(\SimpleXMLElement $tags) {
    $allTags = [];
    foreach ($tags as $tag) {
        $allTags[] = htmlspecialchars($tag);
    }
    return implode(", ", $allTags);
}

這應該返回類似“deutsch, spanisch, englisch”的內容

https://eval.in/885485查看完整演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM