【问题标题】:select an xml object based on piece of deeplink property根据 deeplink 属性选择一个 xml 对象
【发布时间】:2014-08-04 03:35:21
【问题描述】:

我正在开发一个使用 xml 文件在屏幕上打印的页面。现在我只需要将具有起始 url 的对象打印到属性中,如下所示:

<product zupid="d490dd40f6dbaf238f28b57abad92fbf">
     <deepLink>http://ad.zanox.com/ppc/?28132512C86846042&amp;ULP=[[offerte-viaggi/vacanze/sconti-triton-villas-residence-hotel-calabria.html]]</deepLink>
</product>

现在我正在解析所有内容,因为我使用了这个函数:

for ($i=$offset; $i<$limit+$offset; $i++) { 
     $article=$xml->product[$i];
     $link = $article->deepLink;

     echo "<a target='_blank' href='$link'>Go to link</a>";
}

如何仅选择具有该部分属性/url 的对象?

【问题讨论】:

    标签: php xml xml-parsing simplexml filtering


    【解决方案1】:

    SimpleXMLElement::xpath() 方法允许您使用 xpath 表达式来获取元素数组:

    $documentElement = simplexml_load_string($xml);
    
    $offset = 1;
    $count = 2;
    
    $expression = '//product
      [starts-with(deepLink, "http://ad.zanox.com/")]
      [position() >= '.$offset.' and position() < '.($offset + $count).']
    ';
    
    foreach ($documentElement->xpath($expression) as $product) {
      var_dump((string)$product->deepLink);
    }
    

    演示:https://eval.in/162300

    关于表达式:

    选择文档中的所有product 元素...

    //product

    ...如果作为文本的 deepLink 元素以给定字符串开头

    //product [starts-with(deepLink, "http://ad.zanox.com/")]

    用最小值和最大值限制找到的节点列表

    //product [starts-with(deepLink, "http://ad.zanox.com/")] [position() >= 1 and position() < 3]`

    提示:Xpath 中的位置从 1 开始,而不是从 0。

    【讨论】:

    • 感谢您的帮助。我的问题是只使用这一段 url-> ad.zanox.com/ppc/… 但是在更改了你的示例之后它就没有了。为什么?另一个问题是如何加载外部 xml 文件而不是写入同一文件的 xml?如果我使用这个 -> $documentElement = new SimpleXMLElement('testing.xml');不要加载任何东西。为什么?
    • 请将网址示例设置为反引号,否则将对其进行格式化。要使用 SimpleXML 从文件中加载 XML,可以使用 simplexml_load_file() function
    • 在 url 中转义时要小心。它在 XML/HTML 中是 &amp;amp;,但在 Xpath 中只是 &amp;(解析器解码实体)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多