我有一种情况,其中有一些旧代码使用xmlWriter流来解析文件,并且对于每个文件写一个具有该文件名的元素,当文件名是唯一的时,这可以正常工作。
$xml = xmlWriter
foreach file in files
$xml->startElement($fileName)
....existing logic adding file content to the new element.
$xml->endElement
但是现在,需求发生了变化,我可能会有相同名称的文件,但是对于生成的xml,每个唯一文件名应该只有一个元素。
有没有一种简单的方法可以做到这一点,而不用更改我现有的代码?我知道这有点反对作为一条小溪的整个过程,但生活很糟糕,对吗?
答案 0 :(得分:0)
我可以看到几个解决方案,但所有这些解决方案都归结为创建多个节点。
第一个是多个文件的多个节点,但每个文件都有一个路径属性。鉴于这些:
$fl1 = '/home/the_spleen/spleen.txt';
$fl2 = '/home/the_bowler/not_enough_beer/spleen.txt';
输出如下内容:
<spleen path='/home/the_spleen/'><!-- spleenerficy --></spleen>
<spleen path='/home/the_bowler/not_enough_beer/'><!-- no. just no. --></spleen>
主要好处?它允许您以几乎完全相同的方式创建和迭代。损害?它摆脱了一个名称,即该节点的parent.children中的一个节点。
另一种选择是创建子元素。给出相同的文件:
<spleen>
<fl path='/home/the_spleen/'><!-- fl-ify! --></fl>
<fl path='/home/the_bowler/not_enough_beer/'><!-- drink! --></fl>
</spleen>
好处?唯一文件基本名称和节点之间存在1:1的关系。不利?您将需要添加递归逻辑。
鉴于这些选择,我会亲自与第一个一起去。添加递归逻辑似乎可能会导致各种各样的不良和令人烦恼的重新分解。但是我从这里只对你的项目有一个有限的看法。