【问题标题】:XML xpath on SimpleXMLElementSimpleXMLElement 上的 XML xpath
【发布时间】:2017-09-01 04:49:47
【问题描述】:

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

<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>

我想要类似的:

<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>

使用下面的 PHP 代码我没有得到我需要的东西,我错在哪里?有人可以推荐吗?

$test1 = new SimpleXMLElement($testq);

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

    foreach ($test1->xpath('//V[@ID="'.$value["ID"].'"]/F') as $valueF) {

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

        foreach ($test1->xpath('//V[@ID="'.$value["ID"].'"]/F/A') as $valueA) {

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

        }
    }
}

非常感谢 麦芽酒

【问题讨论】:

  • 也许我不明白,但是:你为什么不直接使用正则表达式?
  • 我想调查一下我们使用 XML xpath 导航的可能性...我的目标是获得以下列表 1 - 10 - 10 - 19 1 - 20 - 20 - 21 2 - 100 - 100 - 50 2 - 21 - 120 - 33 3 - 200 - 300 - 99 3 - 44 - 55 - 64

标签: php xml xpath


【解决方案1】:

首先,您应该简化当前的 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”这样的表达式的长形式是“child::V”。 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";
}

【讨论】:

    猜你喜欢
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    相关资源
    最近更新 更多