PHP - запрос XPATH в файле XML - дети и братья и сестры

У меня есть следующий XML-документ, из которого мне нужно получить для каждого узла его дочерние элементы ( ‹ KA>/‹ kod> и ‹ TPV>/‹ TPV>/...‹ A> ). Для лучшего понимания вот что мне нужно:

<KATU/KA/kod> | <KATU/TPV/TPVS/TN> | <KATU/TPV/TPVS/TSA/TS/A>
k11 | VP11 | 11
k21 | VP21 | 21
k31 | VP31 | 31
k32 | VP32 | 32
k33 | VP33 | 33
k41 | VP41 | 41
k41 | VP41 | 42
k41 | VP41 | 43
k51 | VP51 | 51

Основная проблема (например, значения из примера k41 и его 41,42,43) заключается в том, что узлы, которые мне нужно получить, являются не дочерними, а родственными в порядке ‹ KA>‹ TPV>‹ KA>‹ TPV>...

Поэтому мне нужно найти все узлы ‹ A> (дочерние узлы ‹ TPV>‹ TPVS>‹ TSA>‹ TS>), а затем получить его старшего брата (имеются в виду его родители ‹ TPV> верхний брат ‹ KA>), чтобы получить ‹ KA >/‹ код>

Надеюсь, вы понимаете мою проблему, я не могу описать ее больше из-за моего английского.

Спасибо за ответ

Вот мой XML:

<?xml version="1.0" encoding="utf-8" ?>  
<PV>
    <PRAV_VZTAHY>
        <TYPPRA>
            <TN>VP</TN> 
        </TYPPRA>
    </PRAV_VZTAHY>
    <OPRAV_SUBJEKT>
        <CHAROS_KOD>1112</CHAROS_KOD> 
        <OPSUB_ADRESA>
            <adresa>
                <nazev_ulice>xxx</nazev_ulice> 
            </adresa>
        </OPSUB_ADRESA>
    </OPRAV_SUBJEKT>
    <OKRESY>
        <OKRES>
            <nuts4>123456</nuts4> 
            <name>asdf</name> 
        </OKRES>
        <OBCE>
            <OBEC>
                <kod>594580</kod> 
                <name>mn</name> 
            </OBEC>
            <KATU>
                <KA>
                    <kod>k11</kod> 
                    <name>q11</name> 
                </KA>
                <TPV>
                    <TPVS>
                        <TN>VP11</TN> 
                        <TSA>
                            <TS>
                                <A>11</A> 
                            </TS>
                        </TSA>
                    </TPVS>
                </TPV>
            </KATU>
        </OBCE>
        <OKRES>
            <nuts4>46786</nuts4> 
            <name>qwer</name> 
        </OKRES>
        <OBCE>
            <OBEC>
                <kod>525804</kod> 
                <name>mn</name> 
            </OBEC>
            <KATU>
                <KA>
                    <kod>k21</kod> 
                    <name>q21</name> 
                </KA>
                <TPV>
                    <TPVS>
                        <TN>VP21</TN> 
                        <TSA>
                            <TS>
                                <A>21</A> 
                            </TS>
                        </TSA>
                    </TPVS>
                </TPV>
            </KATU>
            <OBEC>
                <kod>540978</kod> 
                <name>mn</name> 
            </OBEC>
            <KATU>
                <KA>
                    <kod>k31</kod> 
                    <name>q31</name> 
                </KA>
                <TPV>
                    <TPVS>
                        <TN>VP31</TN> 
                        <TSA>
                            <TS>
                                <A>31</A> 
                            </TS>
                        </TSA>
                    </TPVS>
                </TPV>
                <KA>
                    <kod>k32</kod> 
                    <name>q32</name> 
                </KA>
                <TPV>
                    <TPVS>
                        <TN>VP32</TN> 
                        <TSA>
                            <TS>
                                <A>32</A>
                            </TS>
                        </TSA>
                    </TPVS>
                </TPV>
                <KA>
                    <kod>k33</kod> 
                    <name>q33</name> 
                </KA>
                <TPV>
                    <TPVS>
                        <TN>VP33</TN> 
                        <TSA>
                            <TS>
                                <A>33</A>  
                            </TS>
                        </TSA>
                    </TPVS>
                </TPV>
            </KATU>
            <OBEC>
                <kod>541265</kod> 
                <name>mn</name> 
            </OBEC>
            <KATU>
                <KA>
                    <kod>k41</kod> 
                    <name>q41</name> 
                </KA>
                <TPV>
                    <TPVS>
                        <TN>VP41</TN> 
                        <TSA>
                            <TS>
                                <A>41</A> 
                            </TS>
                            <TS>
                                <A>42</A>  
                            </TS>
                            <TS>
                                <A>43</A> 
                            </TS>
                        </TSA>
                    </TPVS>
                </TPV>
            </KATU>
            <OBEC>
                <kod>553387</kod> 
                <name>mn</name> 
            </OBEC>
            <KATU>
                <KA>
                    <kod>k51</kod> 
                    <name>q51</name> 
                </KA>
                <TPV>
                    <TPVS>
                        <TN>VP51</TN> 
                        <TSA>
                            <TS>
                                <A>51</A> 
                            </TS>
                        </TSA>
                    </TPVS>
                </TPV>
            </KATU>
        </OBCE>
    </OKRESY>
</PV>

вот мой старт:

foreach ($xml->xpath("//KATU") as $ku) {
        print_r($ku);
        print "<hr />";
}

person porosman    schedule 11.02.2015    source источник


Ответы (1)


Вам нужно прочитать каждый узел и проверить, есть ли у этого узла дочерний узел или нет. А затем перебрать их. Вот ссылка на вопрос stackoverflow, который, я думаю, ответит на ваш вопрос.

Или вы также можете проверить это и эта ссылка. Проверьте комментарии людей в них.

Надеюсь, вы найдете ответ по этим ссылкам.

person Capri82    schedule 11.02.2015
comment
В настоящее время ваш ответ представляет собой не что иное, как набор ссылок. Если в других вопросах на Stackoverflow уже есть ответ на эту проблему, пожалуйста, не отвечайте здесь, потому что тогда вопрос должен быть закрыт как дубликат. Если нет дублирующего сообщения, расширьте этот ответ, включив в него всю необходимую информацию для решения проблемы. - person Mathias Müller; 11.02.2015