是否可以获取标签名称和属性名称,其值最多可以达到n级。 例如,
文件1:
<?xml ?>
<data>
<student>
<std>4th</std>
<student>Alex</student>
<division name="A" />
</student>
</data>
文件2:
<?xml ?>
<data>
<students>
<student>
<std>4th</std>
<student>Alex</student>
<division name="A" />
</student>
<student>
<std>5th</std>
<student>Alice</student>
<division name="D" />
<subject>Drawing</subject>
</student>
</students>
</data>
文件3:
<?xml ?>
<data>
<students>
<student>
<std>4th</std>
<student>Alex</student>
<division name="A" />
</student>
<student>
<std>5th</std>
<student>Alice</student>
<division name="D" />
<subject>Drawing</subject>
</student>
</students>
<students>
<student>
<std>4th</std>
<student>Alex</student>
</student>
<student>
<std>5th</std>
<student>Alice</student>
<division name="D" />
<subject>Drawing</subject>
</student>
<student>
<std>5th</std>
<student>Alice</student>
<division name="D" />
<subject>
<sub1>Drwaing</sub1>
<sub1>Maths</sub1>
</subject>
</student>
</students>
</data>
上面是示例文件1是简单文件,文件2具有更多标签,文件3比其他文件更长。所以我的基本问题是XML文件格式不是预定义的,可能就像上面的示例一样。那么是否有可能在PHP中获取标签名称,属性名称及其值?如果是,那怎么办?
我已经用$xml->children()->children()
和$child->getName()
尝试了一些解决方案,但我找不到任何完美的方法通常对2级或3级都很好,但是对 N 没有解决方案级别的xml标签。
我尝试如下:
$xml='<person>
<child role="son">
<child role="daughter"/>
</child>
<child role="daughter">
<child role="son">
<child role="son"/>
<name role="trainer">
<nickname role="assistant">Nic</nickname>
<fname>Nicolas</fname>
<lname>Johnson</lname>
<hobby>
<sport>
<game>
<name>Cricket</name>
<name type="male">Hockey</name>
<name type="national" />
</game>
</sport>
</hobby>
</name>
</child>
</child>
<child role="daughter">
<child role="son">
<child role="son"/>
<name role="student">Jessika</name>
</child>
<child role="son">
<child role="son"/>
<names>
<name>Nick</name>
</names>
</child>
</child>
<child role="daughter">
<child role="son">
<child role="son"/>
</child>
<child role="son">
<child role="son"/>
<child role="son"/>
<name>Tom</name>
</child>
<child role="son">
<child role="son"/>
<child role="son"/>
<name>John</name>
</child>
</child>
</person>';
$xml = new SimpleXMLElement($xml);
foreach ($xml->children() as $second_gen) {
echo '<br> role=' . $second_gen['role'];
foreach ($second_gen->children() as $third_gen) {
echo '<br> role=' . $third_gen['role'];
foreach ($third_gen->children() as $fourth_gen) {
echo '<br> role=' . $third_gen['role'];
}
}
}
请注意,文件1,文件2和文件3的示例不同,并且上面的示例也不同,所以请不要混淆,我已经提到XML文件和格式不是预定义的,它可以是任何级别。
在上面的示例中,我尝试了3个foreach循环,但是当它达到 N 级时,它不能正常工作。我想完全动态地做。有可能吗?
如果您有更好的想法或方法,可以分享。感谢您的宝贵时间。
我要关注。
我想从XML获取一些值,例如学生姓名,费用,标准,流,科目,部门和其他常规详细信息。现在的主要问题是XML格式未预定义,可能就像我提到的上述示例一样。它是完全动态的,我想根据标签和/或属性值存储在表中。
如果有任何疑问,可以随时询问,我希望能对我想说的内容有所帮助。谢谢。
答案 0 :(得分:0)
Xpath表达式使您可以从XML文档中获取节点(和值)。
$xml = <<<'XML'
<data>
<student>
<std>4th</std>
<student>Alex</student>
<division name="A" />
</student>
</data>
XML;
$data = new SimpleXMLElement($xml);
foreach($data->xpath('//student[student]') as $student) {
var_dump(
[
(string)$student->std,
(string)$student->student,
(string)$student->division['name']
]
);
}
输出:
array(3) {
[0]=>
string(3) "4th"
[1]=>
string(4) "Alex"
[2]=>
string(1) "A"
}
student
元素节点... //student
student
子元素://student[student]
Xpath表达式非常强大。例如,您也可以获取没有student
祖先节点的任何student
:
//student[not(ancestor::student)]