SimpleXMLElement上的XML xpath

时间:2017-04-06 08:57:14

标签: php xml xpath

我需要你的帮助才能从根到叶子的所有(完整)路径列表下面的XML中获取。

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="myApp">
    
    <div ng-controller= "myController">
    
    <div ng-repeat="c in usermsg">
     <div>{{c.name}}</div>
      
    </div>
    <button ng-click="send()">Click to send</button>
    
    
    </div>
    
   
  </body>

我想要类似的:

<List>
    <V ID="1">
        <F>
            <N>10</N>
            <M>10</M>
            <A>
                <IDX>19</IDX>
            </A>
        </F>
        <F>
            <N>20</N>
            <M>20</M>
            <A>
                <IDX>21</IDX>
            </A>
        </F>
    </V>
    <V ID="2">
        <F>
            <N>100</N>
            <M>100</M>
            <A>
                <IDX>50</IDX>
            </A>
        </F>
        <F>
            <N>21</N>
            <M>120</M>
            <A>
                <IDX>33</IDX>
            </A>
        </F>
    </V>
    <V ID="3">
        <F>
            <N>200</N>
            <M>300</M>
            <A>
                <IDX>99</IDX>
            </A>
        </F>
        <F>
            <N>44</N>
            <M>55</M>
            <A>
                <IDX>64</IDX>
            </A>
        </F>
    </V>
</List>

使用以下PHP代码我没有得到我需要的东西,我错在哪里?有人能说些什么?

<V ID="1"><F><N>10</N><M>10</M><A><IDX>19</IDX>
<V ID="1"><F><N>20</N><M>20</M><A><IDX>21</IDX>
<V ID="2"><F><N>100</N><M>100</M><A><IDX>50</IDX>
<V ID="2"><F><N>21</N><M>120</M><A><IDX>33</IDX>
<V ID="3"><F><N>200</N><M>300</M><A><IDX>99</IDX>
<V ID="3"><F><N>44</N><M>55</M><A><IDX>64</IDX>

非常感谢 麦酒

1 个答案:

答案 0 :(得分:0)

首先,您应该简化当前的Xpath表达式。表达式开头的斜杠使它们使用文档本身作为上下文,而不是当前节点。您可以只使用标记名称来缩小它们:

$test1 = new SimpleXMLElement($testq);

foreach ($test1->xpath('V') as $valueV) {
    echo $valueV["ID"]." - ";

    foreach ($valueV->xpath('F') as $valueF) {

        echo $valueF->N." - ";
        echo $valueF->M." - ";

        foreach ($valueF->xpath('A') as $valueA) {

            echo $valueA->IDX." - <BR>";        

        }
    }
}

这使用了一些Xpath默认值。像“V&#39; V&#39;是孩子:: V&#39;。 child是轴。以下是其他轴,其中两个很有意思:descendant(简//)和ancestor

首先让我们迭代文档中的所有A个节点。

foreach ($test1->xpath('.//A') as $valueA) {
   echo $valueA->IDX." - <BR>";         
}

现在,对于每个节点,您都会获取祖先,迭代它们并根据节点输出数据。

foreach ($test1->xpath('.//A') as $valueA) {
  foreach ($valueA->xpath('ancestor::*') as $ancestor) {
    // change that to handle the different ancestor nodes
    echo $ancestor->getName(), ' - ';
  }
  echo $valueA->IDX, "\n";
}