0

我有一种情况,其中有一些旧代码使用 xmlWriter 流来解析文件,并且为每个文件写入一个具有该文件名的元素,当文件名是唯一的时,这可以正常工作。

$xml = xmlWriter
foreach file in files
    $xml->startElement($fileName)
        ....existing logic adding file content to the new element.   
    $xml->endElement

但是现在,要求发生了变化,我可能有同名的文件,但是对于生成的 xml,每个唯一文件名应该只有一个元素。

有没有一种简单的方法可以在不改变现有代码的情况下做到这一点?我知道这有点违背成为流的全部意义,但生活很糟糕,对吧?

4

1 回答 1

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 的关系。害处?您将需要添加递归逻辑。

鉴于这些选择,我个人会选择第一个。添加递归逻辑似乎会导致各种不良和烦人的重构。但我从这里对你的项目只有有限的看法。

于 2011-07-23T04:01:48.380 回答