【发布时间】:2017-02-24 11:38:43
【问题描述】:
我有不同的 XML 文件,我为每个 XML 文件重命名了所有单独的标签,这样每个 XML 文件都具有相同的标签名称。这很容易,因为该函数是为 XML 文件定制的。
除了为每个 XML 文件编写 7 个新函数之外,我现在想检查 XML 文件是否有指定的子文件。因为如果我想说:
foreach ($items as $item) {
$node = dom_import_simplexml($item);
$title = $node->getElementsByTagName('title')->item(0)->textContent;
$price = $node->getElementsByTagName('price')->item(0)->textContent;
$url = $node->getElementsByTagName('url')->item(0)->textContent;
$publisher = $node->getElementsByTagName('publisher')->item(0)->textContent;
$category = $node->getElementsByTagName('category')->item(0)->textContent;
$platform = $node->getElementsByTagName('platform')->item(0)->textContent;
}
我有时会收到:PHP Notice: Trying to get property of non-object in ...
例如。两个不同的 XML 表。一个包含发布者、类别和平台,另一个不包含:
XML 1:
<products>
<product>
<desc>This is a Test</desc>
<price>11.69</price>
<price_base>12.99</price_base>
<publisher>Stackoverflow</publisher>
<category>PHP</category>
</packshot>
<title>Check if child exists? - SimpleXML (PHP)</title>
<url>http://stackoverflow.com/questions/ask</url>
</product>
</products>
XML 2:
<products>
<product>
<image></image>
<title>Questions</title>
<price>23,90</price>
<url>google.de/url>
<platform>Stackoverflow</platform>
</product>
</products>
您会看到,有时一个 XML 文件包含发布者、类别和平台,但有时不包含。 但也可能不是 XML 文件的每个节点都包含第一个中的所有属性!
因此,如果节点包含发布者、类别或/和平台,我需要检查单个 XML 文件的每个节点。
如何使用 SimpleXML 做到这一点? 我考虑过 switch case,但首先我需要检查每个节点中包含哪些子节点。
编辑: 也许我找到了解决方案。这是一个解决方案吗?
if($node->getElementsByTagName('platform')->item(0)){
echo $node->getElementsByTagName('platform')->item(0)->textContent . "\n";
}
您好,谢谢!
【问题讨论】:
-
您可以通过
if(isset($node->getElementsByTagName('publisher')->item))和if(is_array($node->getElementsByTagName('publisher')->item))进行验证 -
但是你应该直接使用
simplexml。 -
But you should use simplexml directly.是什么意思 -
看看我的编辑。你认为这是一个解决方案。还是?