【问题标题】:Parsing an XML with Xpath in PHP在 PHP 中使用 Xpath 解析 XML
【发布时间】:2010-09-02 18:17:14
【问题描述】:

考虑以下代码:

$dom = new DOMDocument();
$dom->loadXML($file);

$xmlPath = new DOMXPath($dom);
$arrNodes = $xmlPath->query('*/item');
foreach($arrNodes as $item){
//missing code
}

$file 是一个 xml,每个项目都有一个标题和描述。 如何显示它们(标题和描述)?

$file = "<item>
   <title>test_title</title>
   <desc>test</desc>
</item>";

【问题讨论】:

    标签: php xml parsing xpath


    【解决方案1】:

    我建议使用 php 的simplexml,这样你仍然可以获得xpath 功能,但是使用更简单的方法,例如你可以访问这样的属性:

    $name = $item['name'];
    

    这是一个例子:

    xmlfile.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <xml>
        <items>
            <item title="Hello World" description="Hellowing the world.." />
            <item title="Hello People" description="greeting people.." />
        </items>
    </xml>
    

    do.php:

    <?php
    $xml_str = file_get_contents('xmlfile.xml');
    $xml = new SimpleXMLElement($xml_str);
    $items = $xml->xpath('*/item');
    
    foreach($items as $item) {
        echo $item['title'], ': ', $item['description'], "\n";
    }
    

    【讨论】:

    • 好的,但是 xpath 有限制吗?
    • @daniphp,您的意思是,您是在询问一般的 xpath 查询功能还是有关 simplexml 的限制?
    【解决方案2】:

    如果您的商品如下所示:

    <item>
        <title>foo</title>
        <description>frob</description>    
    </item>
    

    您可以使用getElementsByTagName() 和nodeValue:

    foreach($arrNodes as $item){
        print $item->getElementsByTagName('title')->item(0)->nodeValue;
    }
    

    title 和 description 是属性吗?例如。项目看起来像这样吗:

    <item title="foo" description="frob" />
    

    如果是这样,您可以使用getAttribute():

    ...
    foreach($arrNodes as $item){
        print $item->getAttribute('title');
    }
    

    【讨论】:

      【解决方案3】:

      正确的 XPath 表达式应该是:

      /*/item/title | /*/item/desc
      

      或者

      /*/item/*[self::title or self::desc]
      

      这是在文档顺序中对具有title 和desc 元素的节点集求值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        相关资源
        最近更新 更多