我找到了相同的主题,但我没有解决我的问题:(
我想用XML搜索产品代码
这是我的代码;
{{1}}
如果我删除“/ STOKADI / GRUPKODU”,它的工作原理。但产品标题,产品图片,产品类别未显示。问题在哪里?
我的第二个问题,当我想展示所有产品时;我看到一些产品至少有4-5次。
(注意:我在WordPress工作)
答案 0 :(得分:1)
我没有使用simple_xml
,但如果需要,使用DOMDocument
和DOMXPath
的方法应该很容易移植到simple_xml
。最初我以为你在寻找STOK_KODU
的子节点,但XML的结构却暗示了这一点。 XPath查询将找到具有相关$product_code
的节点,您可以从中轻松找到父节点,从而找到其中的任何/所有节点。
$file='http://xml.aksel.com.tr/Xml.aspx?SK=d021da08&CK=50288';
#$file='c:/temp/Xml.xml'; /* saved locally to test */
$output=array();
$product_code=13775;
$query='//XMLWEBDATA/STOK_KODU[ contains( text(), "'.$product_code.'" ) ]';
$dom=new DOMDocument;
$dom->load( $file );
$xp=new DOMXPath( $dom );
$col=$xp->query( $query );
if( $col && $col->length > 0 ){
foreach( $col as $node ){
/* get the parent */
$parent=$node->parentNode;
$data=array();
for( $i=0; $i < $parent->childNodes->length; $i++ ){
$tag=$parent->childNodes->item( $i )->tagName;
$value=$parent->childNodes->item( $i )->nodeValue;
if( !empty( $tag ) && !empty( $value ) ) $data[ $tag ]=$value;
}
$output[]=$data;
}
/* remove duplicates if there are any */
$output=array_unique( $output );
}
$xp = $dom = null;
/* process the results accordingly */
if( !empty( $output ) ){
foreach( $output as $obj ){
printf('<pre>%s</pre>', urldecode( http_build_query( $obj, null, PHP_EOL ) ) );
}
}
其输出将是
STOK_KODU=13775
STOK_ADI=CHIP EPSON C3800 Black (S051127)
LISTEFIYAT=2,73
STOKBAKIYE1=16
GRUPKODU=DOLUM ÜRÜNLERİ GRUBU
KOD1=TONER DOLUM ÜRÜNLERİ
KOD2=ÇİPLER
PARABIRIMI=$
KULL5N=9500
RESIMURL=http://xml.aksel.com.tr/Photo.aspx?ID=22705&STOK=13775
要将每个字段作为变量访问(这是我理解您的评论)
foreach( $col as $node ){
/* get the parent */
$parent=$node->parentNode;
$data=array();
for( $i=0; $i < $parent->childNodes->length; $i++ ){
try{
/* test node type to avoid errors */
if( $parent->childNodes->item( $i )->nodeType==XML_ELEMENT_NODE ){
$tag=$parent->childNodes->item( $i )->tagName;
$value=$parent->childNodes->item( $i )->nodeValue;
if( !empty( $tag ) && !empty( $value ) ) $data[ $tag ]=$value;
}
}catch( Exception $e ){
echo $e->getMessage();
continue;
}
}
$output[]=$data;
}
要作为变量访问,请使用extract
if( !empty( $output ) ){
foreach( $output as $obj ){
extract( $obj );
printf("<pre>%s\n%s\n%s</pre>", $STOK_KODU, $STOK_ADI, $GRUPKODU );
}
}
答案 1 :(得分:0)
如果查看XML的结构,GRUPKODU和STOKADI是同一级别的元素。因此,尝试在XPath中同时访问这些内容是行不通的。如果您在后面查找XMLWEBDATA元素,则可以在此元素中访问这些元素。此XPath查找带有STOK_KODU的XMLWEBDATA,其内容包含您之后的产品代码,然后使用foreach
打印出每个匹配项,它会输出您之后的两个值......
$products = $xml->xpath("//XMLWEBDATA[STOK_KODU[contains(text(), '".$product_code."')]]");
foreach ( $products as $product ) {
echo (string)$product->STOK_ADI.PHP_EOL;
echo (string)$product->GRUPKODU.PHP_EOL;
}
(我只将返回值强制转换为字符串,因为如果分配给其他值,echo
会自动转换它,并且在分配中使用时会导致混乱的结果)
如果我设置
$product_code = 14037;
此输出
EPSON T2711XL (27XL) > WF3620,3640,7110,7610,7620 Black
TÜKETİM ÜRÜNLERİ GRUBU
注意:您可能想要使用....
$products = $xml->xpath("//XMLWEBDATA[STOK_KODU='".$product_code."']");
确保您只找到完全匹配的代码,以防万一有与其他代码部分匹配的情况。