如果我有三组数据,请说:
<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文件各有数千行,所以我显然不能只在每个标记中编码。
答案 0 :(得分:2)
听起来你需要一个DTD(文档类型定义),它将定义XML文件所需的格式,并指定所需的元素,可选,它们可以包含的内容等。
DTD可用于在使用XML文件进行任何处理之前验证XML文件。
不幸的是,PHP的simplexml库对DTD没有任何作用,但DomDocument库却没有,所以你可能想要使用它。
我将把它作为一个单独的例外,让您研究如何创建DTD文件。如果您需要更多帮助,我建议将其作为一个单独的问题。
答案 1 :(得分:1)
您可以使用DOMDocument代替。我创建了一个快速演示,使用XML标记名称将<{1}}元素拆分为数组为 keys 。然后,您可以迭代结果数组以创建输出。
我通过将&符号替换为等效的HTML实体(<note>
)来更正无效的XML。
&
修改:如果您更改为<?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 & eggs</message></note>
<note><from>Me</from><message>Need milk & 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();
,则会始终创建完整的键。