Php 读取xml元素
我正在尝试读取如下结构的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
<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"/>