使用 php 拆分大 XML 文件

Split big XML file using php

我正在尝试将一个大文件分组到每个单独的文件中(按其位置索引分组)

样本XML:

<team>
    <player>
        <fname>Jon</fname>
        <lname>Doe</lname>
        <active>Y</active>
        <position>
            <name>forward</name>
            <salary>10 000</salary>
        </position>
        <position>
            <name>center</name>
            <salary>30 000</salary>
        </position> 
        <position>
            <name>power forward</name>
            <salary>15 000</salary>
        </position>         
        <contract>
            <position>forward</position>
            <type>common</type>
        </contract> 
        <contract>
            <position>center</position>
            <type>special</type>
        </contract>
        <contract>
            <position>power forward</position>
            <type>special</type>
        </contract>
        <address>common street</address>
        <age>25</age>       
    </player>
    <player>
        <fname>Average</fname>
        <lname>Joe</lname>
        <active>Y</active>
        <position>
            <name>shootingguard</name>
            <salary>25 000</salary>
        </position>
        <position>
            <name>sixth man</name>
            <salary>22 000</salary>
        </position> 
        <contract>
            <position>sixth man</position>
            <type>extra</type>
        </contract> 
        <contract>
            <position>shootingguard</position>
            <type>common</type>
        </contract> 
        <address>common random street</address>
        <age>21</age>       
    </player>
</team>

预期输出: firstposition.xml

<team>
    <player>
        <fname>Jon</fname>
        <lname>Doe</lname>
        <active>Y</active>
        <position>
            <name>forward</name>
            <salary>10 000</salary>
        </position>
        <contract>
            <position>forward</position>
            <type>common</type>
        </contract> 
        <address>common street</address>
        <age>25</age>       
    </player>   
    <player>
        <fname>Average</fname>
        <lname>Joe</lname>
        <active>Y</active>
        <position>
            <name>shootingguard</name>
            <salary>25 000</salary>
        </position>
        <contract>
            <position>shootingguard</position>
            <type>common</type>
        </contract>
        <address>common random street</address>
        <age>21</age>   
    </player>
</team>

secondposition.xml

<team>
    <player>
        <fname>Jon</fname>
        <lname>Doe</lname>
        <active>Y</active>
        <position>
            <name>center</name>
            <salary>30 000</salary>
        </position>
        <contract>
            <position>center</position>
            <type>special</type>
        </contract> 
        <address>common street</address>
        <age>25</age>       
    </player>
    <player>
        <fname>Average</fname>
        <lname>Joe</lname>
        <active>Y</active>
        <position>
            <name>sixth man</name>
            <salary>22 000</salary>
        </position> 
        <contract>
            <position>sixth man</position>
            <type>extra</type>
        </contract> 
        <address>common random street</address>
        <age>21</age>   
    </player>
</team>

thirdposition.xml

<team>
    <player>
        <fname>Jon</fname>
        <lname>Doe</lname>
        <active>Y</active>
        <position>
            <name>powerforward</name>
            <salary>15 000</salary>
        </position>
        <contract>
            <position>powerforward</position>
            <type>average</type>
        </contract> 
        <address>common street</address>
        <age>25</age>       
    </player>
</team>

在这种情况下我在哪里?我可以拆分文件并根据需要操作它们,但我无法达到我想要的结果。

首先我得到所有的职位和合同都是这样的

$positions = $player->getElementsByTagName("position");
$contracts = $player->getElementsByTagName("contract");

然后我遍历每个位置(只是获取位置名称值并将其推入另一个数组)

foreach($positions as $pos){
array_push ($tempPost,$pos->getElementsByTagName("name")->item(0)->nodeValue); }

然后再次迭代到 $positions 现在比较它们并根据需要删除不必要的标签

for ($i = 0; $i < $positions->length; $i++) {
    $c_post = $positions->item($i)
    $c_cont = $contracts ->item($i)
    #first position remove other position
        if($c_post->getElementsByTagName("name")->item(0)->nodeValue != tempPost[0]){
            $c_post->parentNode->removeChild($c_post);
            $i--;            
    }
}

这工作正常我能够删除非第一职位我遇到的问题是根据职位名称删除合同。 如果我通过 $c_cont = $contracts ->item($i) 删除它,这显然会删除随机合同(取决于迭代),我的目标是根据职位名称查找合同并将其删除。

现在,我的最后一个问题是。我如何根据条件在 $contracts 中查找?

我的想法是

c_cont = the result of  ( select from $contracts where position = $c_post->getElementsByTagName("name")->item(0)->nodeValue )

此可视化使用 SQL 术语但不确定如何在 PHP 上实现它。

如果我得到了,我可以像上面的方法一样删除它$c_cont->parentNode->removeChild($c_cont);

抱歉这么久 post 并提前感谢您的帮助。

您想使用 DOMXpath 按条件查找元素。

最后我只是将值与 2 个循环进行比较,不确定这是否是最有效的,但它很好地解决了我的问题。