在PHP

2010-09-02 36 views
1

解析使用XPath的XML考虑下面的代码:在PHP

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

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

的$文件是一个XML,并且每个项目都有一个标题和描述。 如何显示它们(标题和说明)?

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

回答

2

如果你的项目是这样的:

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

你可以使用getElementsByTagName()nodeValue

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

titledescription属性?例如,没有一个项目像这样:

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

如果是这样,你可以只使用getAttribute()

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

他们是节点。 – danidacar 2010-09-02 18:31:22

6

我建议使用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.p马力:

<?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"; 
} 
+0

好吧,但xpath是有限的吗? – danidacar 2010-09-02 18:25:01

+0

我编辑添加一个例子,如果你想检查和测试。 – aularon 2010-09-02 18:30:09

+0

@daniphp,你的意思是说,你是在问一般的xpath查询能力还是关于simplexml的限制? – aularon 2010-09-02 18:34:59

0

正确的XPath表达式应该是:

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

或者

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

这是评估te按照文档顺序设置为titledesc元素的节点