【问题标题】:Searching XML using XPath for multiple attributes in php使用 XPath 在 php 中搜索 XML 以获取多个属性
【发布时间】:2018-01-10 07:31:59
【问题描述】:

我找到了相同的主题,但我没有解决我的问题:(

我想用产品代码在 XML 中搜索

这是我的代码;

$xml = simplexml_load_file('http://xml.aksel.com.tr/Xml.aspx?SK=d021da08&CK=50288');
                    $product_code = $_GET['s'];
                    $products = $xml->xpath("//STOK_KODU[contains(text(), '".$product_code."')]/STOK_ADI/GRUPKODU");

如果我删除“/STOKADI/GRUPKODU”,它的工作。但是没有显示产品标题、产品图片、产品类别。问题出在哪里?

还有我的第二个问题,当我想展示所有产品时;我看到一些产品至少 4-5 次。

(注意:我在 WordPress 工作)

【问题讨论】:

  • 您的$product_code 是什么,它提供多种产品作为回报?
  • $product_code=$_GET['s'];退回一件产品。

标签: php xml wordpress xpath


【解决方案1】:

我不使用simple_xml,但如果需要,使用DOMDocumentDOMXPath 应该很容易移植到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 );

                }
            }

【讨论】:

  • 你好,我得到了这个结果,但是我得到的结果却是变量。 $stokadi = $obj->STOK_ADI; $stokkodu = $obj->STOK_KODU; $kategori = $obj->GRUPKODU; $childkategori = $obj->KOD3;不工作
  • 我尝试 $stokadi = $obj->getElementsByTagName('STOK_ADI') 但我得到 php 致命错误调用非对象上的成员函数 getElementsByTagName()
  • :) 乐于助人
  • 最后一个问题 :) xml url 和一些标签无论如何都改变了.. 我如何获取 url 参数。我尝试 getElementsByTagName, getAttributes 但得到 php 致命错误:(
  • 不确定我理解你的意思
【解决方案2】:

如果您查看 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."']");

确保您只找到完全匹配的代码,以防它与其他代码的部分匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多