Php 读取xml元素

Php 读取xml元素,php,xml,Php,Xml,我正在尝试读取如下结构的xml文件 <dictionary> <head> <DNUM /> <DEF value="definition1" /> <EXAMPLE value="example of 1" /> <EXAMPLE value="example of 1" /> <DNUM /> <DEF value="definition2" /> <EXAMPLE value="exa

我正在尝试读取如下结构的xml文件

<dictionary>
<head>

<DNUM />
<DEF value="definition1" />
<EXAMPLE value="example of 1" />
<EXAMPLE value="example of 1" />

<DNUM />
<DEF value="definition2" />
<EXAMPLE value="example of 2" />
<EXAMPLE value="example of 2" />
<EXAMPLE value="example of 2" />
<EXAMPLE value="example of 2" />

<DNUM />
<DEF value="definition3" />
<EXAMPLE value="example of 3" />


</head>
</ dictionary>

使用下面的代码,我可以阅读“head”标记中的所有定义或示例

$result=$xml->xpath('//dictionary/head');
while(列表(,$node)=每个($result)){
foreach($node->DEF as$DEF){
echo$def[“value”]。“
\n”; } }

但是我想得到每一个定义和这个定义的例子。我认为DNUM标签可以用于此目的,但由于它没有单独的打开和关闭,我无法找到如何获得我想要的结果。

我不确定是否理解您的问题,但如果您需要查找DEF和该DEF的示例,它可以是

    $result = $xml->xpath('//dictionary/head/DEF');
 while(list( , $node) = each($result)) {
   foreach($node->EXAMPLE as $example){
        echo  $example["value"]."<br>\n";
   }
 }
$result=$xml->xpath('//dictionary/head/DEF');
while(列表(,$node)=每个($result)){
foreach($node->EXAMPLE作为$EXAMPLE){
echo$example[“value”]。“
\n”; } }
为什么不使用SimpleXMLElement

$sxe = new SimpleXMLElement($xml);

$def = $sxe->head->dictionary->DEF->attributes(); //you can foreach this
//or
$def = $sxe['head']['dictionary']['DEF']->attributes(); //you can foreach this
你可以用类似的方式得到这些例子。SXE可以像对象或数组一样使用,并且可以通过foreach进行迭代

我个人认为SimpleXMLElement是使用XML和PHP最简单的方法

进一步阅读:
我用这种方法解决了这个问题

$result = $xml->xpath('//dictionary/headword/*[name()="DEF" or name()="EXAMPLE"]');
 foreach($result  as $res){
     echo $res["value"]."<br>";
 }
$result=$xml->xpath('//dictionary/headword/*[name()=“DEF”或name()=“EXAMPLE”]”);
foreach(结果为$res){
回声$res[“值”]。“
”; }
由于XML结构不是层次结构,因此只能计算。例如,以下
DNUM
元素的数量:

$name     = 'DNUM';
$elements = $xml->xpath("//$name");
$count    = count($elements);
foreach ($elements as $index => $element) {
    $count--;
    echo "Iteration $index\n";
    foreach ($element->xpath("following-sibling::*[count(./following-sibling::$name) = $count]") as $following) {
        echo $following->asXML(), "\n";
    }
    echo "\n";
}
示例性输出:

Iteration 0
<DEF value="definition1"/>
<EXAMPLE value="example of 1"/>
<EXAMPLE value="example of 1"/>

Iteration 1
<DEF value="definition2"/>
<EXAMPLE value="example of 2"/>
<EXAMPLE value="example of 2"/>
<EXAMPLE value="example of 2"/>
<EXAMPLE value="example of 2"/>

Iteration 2
<DEF value="definition3"/>
<EXAMPLE value="example of 3"/>
迭代0
迭代1
迭代2

您确定xml没有错误吗?@ajreal:这是windows字典应用程序使用的结构。xml是无效的。它不应该用于Closing。我不太了解以下兄弟的用法。我刚刚开始读有关它的书。无论如何,代码只输出“迭代0/1/2”。@mustafa:输出如anser中所示。如果只看到编写的内容,则需要在浏览器中查看源代码,使用浏览器窗口自然不会显示XML。
Iteration 0
<DEF value="definition1"/>
<EXAMPLE value="example of 1"/>
<EXAMPLE value="example of 1"/>

Iteration 1
<DEF value="definition2"/>
<EXAMPLE value="example of 2"/>
<EXAMPLE value="example of 2"/>
<EXAMPLE value="example of 2"/>
<EXAMPLE value="example of 2"/>

Iteration 2
<DEF value="definition3"/>
<EXAMPLE value="example of 3"/>