我有一个(n)XML文件:
<xml ..... >
- <tandlege_hansen> // = dentist_hansen
<data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
<data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
<data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
.....
- <tandlege_hansen>
并在PHP部分中执行以下操作:
<?php
$reader = new XMLReader();
if (!$reader->open("data.xml"))
{
die("Failed to open 'data.xml'");
}
....
?>
a lot of HTML-code
<?php
while ($reader->read())
{
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'data')
{
$var1 = $reader->getAttribute('var1');
$var2 = $reader->getAttribute('var2');
$var3 = $reader->getAttribute('var3');
.....
?>
another - lots of HTML-code incluing "echo ($var1 .. $var3); .."
<?php
}
}
$reader->close();
?>
这很有效。
现在Dentist Hansen希望像这样更改XML文件:
<xml ..... >
- <tandlege_hansen>
<week_01>
<data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
<data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
<data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
</week_01>
.....
// Numbers af lines (<data .. >) can be a random number between 1 and 64 independent of week_number (week_01).
<week_52>
<data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
<data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
<data var1 = "bla" var2="blabla" var3 ="blablabla" .... />
.....
</week_52>
</tandlege_hansen>
现在的问题是:
while ($reader->read())
{
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'data')
我需要在这里的某个地方: 阅读week_xx, 提取week_numer(= xx), 与实际的week_number进行比较,并将XML-reader-position重新定位到实际周(this_week = week_xx)(欧洲标准),如果找到, 读取XML数据(var1 - &gt; var3), 显示并终止
我该怎么做?
答案 0 :(得分:0)
XMLReader扩展是一个XML Pull解析器。读者在文档流中作为光标前进,并在途中停在每个节点上。
换句话说,您不能从文档中的一个位置跳到另一个任意位置。
此外,该类不允许您编辑Xml内容,您可以做的最多的是逐步读取Xml并通过手工将其写回文件来保存它。
更简单的解决方案是不使用XMLReader
,而是使用SimpleXML
(documentation),它会加载将文档作为可编辑树。然后,您可以使用 xpath 查询来查找文档的特定节点。
缺点是,由于它一次加载整个文档,如果文档很大,可能需要大量内存。有关详细信息,请参阅这两个类的文档。