PHP 输出 SimpleXMLElement
PHP Output SimpleXMLElement
我正在尝试读取我的 .php 中的简单XML元素以补充搜索功能。我通过 file_get_contents
请求从德语同义词 API 中获取 XML,称为 openthesaurus.de。然后我把接收到的元素变成一个SimpleXMLElement,并尝试读取每个term
的属性。 (我知道下面的代码只关注synset['0']
)。这样做是为了保持简单。
我的 .php 看起来像这样
$url = "https://www.openthesaurus.de/synonyme/search?q=". $keyword. "&format=text/xml";
$options = array('http' =>
array(
'method' => 'POST',
'header' => 'user_agent: my-site.xyz',
)
);
$context = stream_context_create($options);
$recive = file_get_contents($url, false, $context);
if (($recieve = file_get_contents($url))===false){
echo "Error fetching XML\n";
} else {
libxml_use_internal_errors(true);
$syn = new SimpleXMLElement($recieve);
if (!$syn) {
echo "Error loading XML\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
} else {
echo "content: <br>";
foreach($syn->synset[0]->term as $value){
echo $value. "<br>";
}
}
}
xml 看起来像这样:
<matches>
<metaData>
<apiVersion content="0.1.3"/>
<warning content="WARNING -- this XML format may be extended without warning"/>
<copyright content="Copyright (C) 2019 Daniel Naber (www.danielnaber.de)"/>
<license content="Creative Commons Attribution-ShareAlike 4.0 or GNU LESSER GENERAL PUBLIC LICENSE Version 2.1"/>
<source content="https://www.openthesaurus.de"/>
<date content="Sat Jun 27 09:48:33 CEST 2020"/>
</metaData>
<synset id="292">
<categories/>
<term term="Erprobung"/>
<term term="Probe"/>
<term term="Prüfung"/>
<term term="Test"/>
<term term="Versuch"/>
</synset>
<synset id="4398">
<categories/>
<term term="Leistungsnachweis"/>
<term term="Prüfung"/>
<term term="Test"/>
</synset>
<synset id="5752">
<categories/>
<term term="Klassenarbeit"/>
<term term="Klausur"/>
<term term="Leistungsüberprüfung"/>
<term term="Lernerfolgskontrolle"/>
<term term="Prüfung"/>
<term term="Schularbeit"/>
<term term="Schulaufgabe"/>
<term term="Test"/>
<term term="Arbeit" level="umgangssprachlich"/>
</synset>
<synset id="9138">
<categories/>
<term term="Experiment"/>
<term term="(die) Probe aufs Exempel"/>
<term term="Probelauf"/>
<term term="Studie"/>
<term term="Test"/>
<term term="Testballon"/>
<term term="Testlauf"/>
<term term="Trockenlauf"/>
<term term="Trockentest"/>
<term term="Versuch"/>
<term term="Versuchsballon"/>
</synset>
<synset id="6241">
<categories/>
<term term="Bewährungsprobe"/>
<term term="Feuerprobe"/>
<term term="Feuertaufe"/>
<term term="harte Prüfung"/>
<term term="Lackmustest"/>
<term term="Nagelprobe"/>
<term term="Test"/>
</synset>
</matches>
不幸的是 .php 没有输出,除了中断。我也试过通过 print_r 输出,这也没有帮助。然而,带有 empty($value)
的 if 条件显示 $value
不为空。
我不熟悉 SimpleXMLElement
或任何 SimpleXML
系列,但如果您更改以下内容
foreach($syn->synset[0]->term as $value){
echo $value. "<br>";
}
到
foreach( $syn->synset as $obj ){
foreach( $obj->term as $arr ){
foreach( $arr->attributes() as $attr => $value ) echo $attr . ' ' . $value .'<br />';
}
}
或者更完整地说:
<?php
$keyword='kopf'; # for example...
$url = "https://www.openthesaurus.de/synonyme/search?q=". $keyword. "&format=text/xml";
$options = array('http' =>
array(
'method' => 'POST',
'header' => 'user_agent: my-site.xyz',
)
);
$context = stream_context_create( $options );
$recive = file_get_contents( $url, false, $context );
if( ( $recieve = file_get_contents( $url ) )===false ){
echo "Error fetching XML\n";
} else {
libxml_use_internal_errors(true);
$syn = new SimpleXMLElement( $recieve );
if (!$syn) {
echo "Error loading XML\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
} else {
foreach( $syn->synset as $obj ){
foreach( $obj->term as $arr ){
foreach( $arr->attributes() as $attr => $value ) echo $attr . ' ' . $value .'<br />';
}
}
}
}
?>
你应该得到一些更有意义的输出,例如:
term Haupt
term Kopf
term Caput
level fachsprachlich
term Ballon
level umgangssprachlich
term Birne
level umgangssprachlich
term Denkapparat
level umgangssprachlich
term Denkzentrum
level umgangssprachlich
term Dez
level umgangssprachlich
term Kopp
level umgangssprachlich
term Murmel
level umgangssprachlich
term Nischel
level umgangssprachlich
term Nuss
level umgangssprachlich
term Omme
level umgangssprachlich
term Rübe
level umgangssprachlich
term Schädel
level umgangssprachlich
term Anführer
term Führer
term Häuptling
term Hauptmann
term (führender) Kopf
term Leiter
term Oberhaupt
term Capo (einer Ultra-Gruppe)
level fachsprachlich
term Chef
level umgangssprachlich
我正在尝试读取我的 .php 中的简单XML元素以补充搜索功能。我通过 file_get_contents
请求从德语同义词 API 中获取 XML,称为 openthesaurus.de。然后我把接收到的元素变成一个SimpleXMLElement,并尝试读取每个term
的属性。 (我知道下面的代码只关注synset['0']
)。这样做是为了保持简单。
我的 .php 看起来像这样
$url = "https://www.openthesaurus.de/synonyme/search?q=". $keyword. "&format=text/xml";
$options = array('http' =>
array(
'method' => 'POST',
'header' => 'user_agent: my-site.xyz',
)
);
$context = stream_context_create($options);
$recive = file_get_contents($url, false, $context);
if (($recieve = file_get_contents($url))===false){
echo "Error fetching XML\n";
} else {
libxml_use_internal_errors(true);
$syn = new SimpleXMLElement($recieve);
if (!$syn) {
echo "Error loading XML\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
} else {
echo "content: <br>";
foreach($syn->synset[0]->term as $value){
echo $value. "<br>";
}
}
}
xml 看起来像这样:
<matches>
<metaData>
<apiVersion content="0.1.3"/>
<warning content="WARNING -- this XML format may be extended without warning"/>
<copyright content="Copyright (C) 2019 Daniel Naber (www.danielnaber.de)"/>
<license content="Creative Commons Attribution-ShareAlike 4.0 or GNU LESSER GENERAL PUBLIC LICENSE Version 2.1"/>
<source content="https://www.openthesaurus.de"/>
<date content="Sat Jun 27 09:48:33 CEST 2020"/>
</metaData>
<synset id="292">
<categories/>
<term term="Erprobung"/>
<term term="Probe"/>
<term term="Prüfung"/>
<term term="Test"/>
<term term="Versuch"/>
</synset>
<synset id="4398">
<categories/>
<term term="Leistungsnachweis"/>
<term term="Prüfung"/>
<term term="Test"/>
</synset>
<synset id="5752">
<categories/>
<term term="Klassenarbeit"/>
<term term="Klausur"/>
<term term="Leistungsüberprüfung"/>
<term term="Lernerfolgskontrolle"/>
<term term="Prüfung"/>
<term term="Schularbeit"/>
<term term="Schulaufgabe"/>
<term term="Test"/>
<term term="Arbeit" level="umgangssprachlich"/>
</synset>
<synset id="9138">
<categories/>
<term term="Experiment"/>
<term term="(die) Probe aufs Exempel"/>
<term term="Probelauf"/>
<term term="Studie"/>
<term term="Test"/>
<term term="Testballon"/>
<term term="Testlauf"/>
<term term="Trockenlauf"/>
<term term="Trockentest"/>
<term term="Versuch"/>
<term term="Versuchsballon"/>
</synset>
<synset id="6241">
<categories/>
<term term="Bewährungsprobe"/>
<term term="Feuerprobe"/>
<term term="Feuertaufe"/>
<term term="harte Prüfung"/>
<term term="Lackmustest"/>
<term term="Nagelprobe"/>
<term term="Test"/>
</synset>
</matches>
不幸的是 .php 没有输出,除了中断。我也试过通过 print_r 输出,这也没有帮助。然而,带有 empty($value)
的 if 条件显示 $value
不为空。
我不熟悉 SimpleXMLElement
或任何 SimpleXML
系列,但如果您更改以下内容
foreach($syn->synset[0]->term as $value){
echo $value. "<br>";
}
到
foreach( $syn->synset as $obj ){
foreach( $obj->term as $arr ){
foreach( $arr->attributes() as $attr => $value ) echo $attr . ' ' . $value .'<br />';
}
}
或者更完整地说:
<?php
$keyword='kopf'; # for example...
$url = "https://www.openthesaurus.de/synonyme/search?q=". $keyword. "&format=text/xml";
$options = array('http' =>
array(
'method' => 'POST',
'header' => 'user_agent: my-site.xyz',
)
);
$context = stream_context_create( $options );
$recive = file_get_contents( $url, false, $context );
if( ( $recieve = file_get_contents( $url ) )===false ){
echo "Error fetching XML\n";
} else {
libxml_use_internal_errors(true);
$syn = new SimpleXMLElement( $recieve );
if (!$syn) {
echo "Error loading XML\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
} else {
foreach( $syn->synset as $obj ){
foreach( $obj->term as $arr ){
foreach( $arr->attributes() as $attr => $value ) echo $attr . ' ' . $value .'<br />';
}
}
}
}
?>
你应该得到一些更有意义的输出,例如:
term Haupt
term Kopf
term Caput
level fachsprachlich
term Ballon
level umgangssprachlich
term Birne
level umgangssprachlich
term Denkapparat
level umgangssprachlich
term Denkzentrum
level umgangssprachlich
term Dez
level umgangssprachlich
term Kopp
level umgangssprachlich
term Murmel
level umgangssprachlich
term Nischel
level umgangssprachlich
term Nuss
level umgangssprachlich
term Omme
level umgangssprachlich
term Rübe
level umgangssprachlich
term Schädel
level umgangssprachlich
term Anführer
term Führer
term Häuptling
term Hauptmann
term (führender) Kopf
term Leiter
term Oberhaupt
term Capo (einer Ultra-Gruppe)
level fachsprachlich
term Chef
level umgangssprachlich