【问题标题】:Get values XML feed by name - PHP按名称获取值 XML 提要 - PHP
【发布时间】:2015-09-30 14:23:37
【问题描述】:

我正在使用 XML 通过 PHP 将产品插入到我的数据库中。我可以使用以下代码访问/读取 xml 提要:

$xml=simplexml_load_file('testfeed.xml') or die("Error: Cannot create object");
foreach($xml->children() as $product) {
    $pname = $product->name;
    $pdescr = $product->description;
    echo $pname;
    echo $pdescr;
    }

下面是我的 XML 示例:

<product ID="9">
<name>Product X</name>
<properties>
<property name="categoryPath">
<value>path-to-category</value>
</property>
<property name="stock">
<value>1</value>
</property>
</properties>
</product>

获取name的值很容易,但是我如何获取categorypath的值,因为这个在properties->property->value中并在&lt;property name="categoryPath"&gt;中声明?

谢谢!

【问题讨论】:

  • 你能更改xml标签“值”的名称吗?

标签: php xml tags


【解决方案1】:

无需过多循环结构的最简单方法是使用 XPath:

$values = $xml->xpath('//property[@name="categoryPath"]/value');

只需遍历返回的数组,并在需要时将每个结果转换为字符串,就完成了。

【讨论】:

  • 您好,感谢您的帮助!我需要设置什么路径?完整路径如:$xml->xpath('/products/product/properties/property[@name="categoryPath"]/value')?
  • 取决于您的 xml 结构。我在示例中编写的那个将为您提供具有给定值的 name 属性的所有属性节点,无论它们在结构中的什么位置。如果按照定义,您能够提供完整的绝对路径,那么出于性能原因,您应该更喜欢它。第三种情况是您在不同路径中有属性节点,但您不需要全部。然后也使用完整路径。
  • 您好,Jossif,谢谢!如果我使用你的例子,我会得到输出“Array”。我错过了什么吗?
  • 我刚刚编辑了我的第一个版本的解决方案。 xpath() 返回 SimpleXMLElement 对象的数组。你可以遍历它们。要获取每个元素的实际值,只需转换为字符串或使用字符串中的元素(因为 SimpleXMLElement 有一个神奇的 __toString() 方法可以为您进行转换)。
  • 超级!当通过它们循环时: foreach($pcat as $pcat2) { echo $pcat2; } 我得到了类别路径,谢谢 Jossif!
【解决方案2】:
$xml=simplexml_load_file('./testfeed.xml') or die("Error: Cannot create object");
foreach($xml->children() as $product) {
    $pname = $product->name;
    $pdescr = $product->properties->property["name"];
    $pdvalue = (string)$product->properties->property->value;
    echo "Prdo Name: $pname\n";
    echo "Prod Desc: $pdescr\n";
    echo "Prod Value: $pdvalue\n";

}

输出:

   Prdo Name: Product X
   Prod Desc: categoryPath
   Prod Value: path-to-category

【讨论】:

    【解决方案3】:

    更新: 虽然 Jossif 的回答非常擅长批量获取所有节点,但我在不使用 xpath 的情况下对更新的 xml 结构进行了编辑:

    $property = $product->properties->property;
    $propertyAttribute = $property->attributes()->{'name'};
    
    $catPath = ($propertyAttribute=="categoryPath")? $property->value : "value for missing paths";
    
    print $catPath . PHP_EOL;
    

    由于您似乎没有任何其他类似的 xml 节点,因此您不需要属性来分隔它们。

    你应该可以安全地使用它

    $catPath = $product->properties->property->value;
    print $catPath;
    

    value 节点获取字符串。

    【讨论】:

    • 嗨,对不起,我有限的 xml 示例,但它具有相似的 xml 节点,因此名称为“value”的节点更多
    • 你能发布一个更好更广泛的示例 xml 吗?
    • 嗨,亚历克斯,感谢您的帮助。我在示例中添加了另一个节点,添加了名称为“stock”的相同结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2014-02-08
    相关资源
    最近更新 更多