【问题标题】:How to search in XML file using php?如何使用 php 在 XML 文件中进行搜索?
【发布时间】:2014-12-20 05:50:43
【问题描述】:

不知道有没有办法在xml文件中搜索。例如。我想使用 AttrList 中的 NameProductCode 获取 Value。可能吗 ?这就是我的 xml 的样子:

<Product>
    <ProductCode>70-14UF44-00</ProductCode>
    <Vendor>NBM</Vendor>
    <ProductType>Soft. Unsorted application</ProductType>
    <ProductCategory>Software</ProductCategory>
    <ProductDescription>{Bluetooth Driver IVT V.1.4.9.3, 1pk, Full Package, OEM, 1pk for 12M3W/15G3WS, 1pk, 1pk}</ProductDescription>
    <Image>https://www.it4profit.com/catalogimg/wic/1/70-14UF44-00</Image>
    <ProductCard>https://content.it4profit.com/itshop/itemcard_cs.jsp?ITEM=50409104050320315&amp;THEME=asbis&amp;LANG=ro</ProductCard>
    <AttrList>
      <element Name="Tipul licentei" Value="Full Package"/>
      <element Name="License Conditions" Value="OEM"/>
      <element Name="Produs de baza(1)" Value="12M3W/15G3WS"/>
      <element Name="Greutatea bruta a pachetului" Value="1.546 kg"/>
      <element Name="Bucati in pachet" Value="1"/>
    </AttrList>
    <MarketingInfo>
      <element></element>
    </MarketingInfo>
    <Images/>
  </Product>

我正在使用来自 PHPSimpleXML 库 尝试使用 DOMDocument:

$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->Load('produse_catalog.xml');
$xpath = new DOMXPath($doc);
$query = '//ProductCatalog/Product/ProductCode[. = "PMP5297C_QUAD"]';

$entries = $xpath->query($query);
foreach ($entries as $entry) {
    echo "Found {$entry->previousSibling->previousSibling->nodeValue}," .
    " by {$entry->previousSibling->nodeValue}\n";
}

结果是:注意:试图获取非对象的属性。我做错了什么?

【问题讨论】:

标签: php xml xpath simplexml


【解决方案1】:

是的,在这种情况下,您可以将 simplexml 与 xpath 一起使用:

$xml = simplexml_load_file('path/to/xml/file.xml');
$name = 'Tipul licentei';
$product_code = '70-14UF44-00';
$products = $xml->xpath("//Product/ProductCode[contains(text(), '$product_code')]/following-sibling::AttrList/element[@Name='$name']");
if(count($products) > 0) { // if found

    $value = (string) $products[0]->attributes()->Value;
    echo $value; // Full Package

}

Sample Output

DOMDocument 也可以:

$dom = new DOMDocument();
$dom->load('path/to/xml/file.xml');
$xpath = new DOMXpath($dom);

$name = 'Tipul licentei';
$product_code = '70-14UF44-00';
$value = $xpath->evaluate("string(//Product/ProductCode[contains(text(), '$product_code')]/following-sibling::AttrList/element[@Name='$name']/@Value)");
echo $value; // Full Package

【讨论】:

  • +1 建议 simplexml_load_file 使用 DOMDocument。
  • @killneel 实际上 domdocument 在这种情况下也可以。两者都有可能。你可以选择你喜欢的那一个
【解决方案2】:

您可以为此目的使用 DOMXPath。 示例取自php.net

  $doc = new DOMDocument;
  $doc->preserveWhiteSpace = false;
  $doc->Load('book.xml');
  $xpath = new DOMXPath($doc);
  // We starts from the root element
 $query = '//book/chapter/para/informaltable/tgroup/tbody/row/entry[. = "en"]';

 $entries = $xpath->query($query);

 foreach ($entries as $entry) {
   echo "Found {$entry->previousSibling->previousSibling->nodeValue}," .
     " by {$entry->previousSibling->nodeValue}\n";
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多