PHP处理缺少的XML数据

时间:2011-06-03 14:34:37

标签: php xml simplexml xml-parsing

如果我有三组数据,请说:

<note><from>Me</from><to>someone</to><message>hello</message></note>

<note><from>Me</from><to></to><message>Need milk & eggs</message></note>

<note><from>Me</from><message>Need milk & eggs</message></note>

我正在使用simplexml有没有办法让简单的xml检查是否有自动的空/缺席标签?

我希望输出为:

FROM    TO     MESSAGE
Me    someone    hello
Me    NULL    Need milk & eggs
Me    NULL    Need milk & eggs

现在我正在手动执行此操作,我很快意识到需要很长时间才能为长xml文件执行此操作。

我目前的示例代码:

$xml = simplexml_load_string($string);
if ($xml->from != "") {$out .= $xml->from."\t"} else {$out .= "NULL\t";}
//repeat for all children, checking by name

有时订单也不同,可能有一个xml:

<note><message>pick up cd</message><from>me</from></note>

因此,遍历子项并按索引计数检查不起作用。

我正在使用的实际xml文件各有数千行,所以我显然不能只在每个标记中编码。

2 个答案:

答案 0 :(得分:2)

听起来你需要一个DTD(文档类型定义),它将定义XML文件所需的格式,并指定所需的元素,可选,它们可以包含的内容等。

DTD可用于在使用XML文件进行任何处理之前验证XML文件。

不幸的是,PHP的simplexml库对DTD没有任何作用,但DomDocument库却没有,所以你可能想要使用它。

我将把它作为一个单独的例外,让您研究如何创建DTD文件。如果您需要更多帮助,我建议将其作为一个单独的问题。

答案 1 :(得分:1)

您可以使用DOMDocument代替。我创建了一个快速演示,使用XML标记名称将<{1}}元素拆分为数组为 keys 。然后,您可以迭代结果数组以创建输出。

我通过将&符号替换为等效的HTML实体(<note>)来更正无效的XML。

&amp;

修改:如果您更改为<?php libxml_use_internal_errors(true); $xml = <<<XML <notes> <note><from>Me</from><to>someone</to><message>hello</message></note> <note><from>Me</from><to></to><message>Need milk &amp; eggs</message></note> <note><from>Me</from><message>Need milk &amp; eggs</message></note> <note><message>pick up cd</message><from>me</from></note> </notes> XML; function getNotes($nodelist) { $notes = array(); foreach ($nodelist as $node) { $noteParts = array(); foreach ($node->childNodes as $child) { $noteParts[$child->tagName] = $child->nodeValue; } $notes[] = $noteParts; } return $notes; } $dom = new DOMDocument(); $dom->recover = true; $dom->loadXML($xml); $xpath = new DOMXPath($dom); $nodelist = $xpath->query("//note"); $notes = getNotes($nodelist); print_r($notes); ?> $noteParts = array();,则会始终创建完整的