获取XML标记和属性直至n级

时间:2018-08-05 04:11:50

标签: php xml

是否可以获取标签名称和属性名称,其值最多可以达到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格式未预定义,可能就像我提到的上述示例一样。它是完全动态的,我想根据标签和/或属性值存储在表中。

如果有任何疑问,可以随时询问,我希望能对我想说的内容有所帮助。谢谢。

1 个答案:

答案 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" 
}

Xpath表达式

  • 文档中的任何student元素节点...
    //student
  • ...具有student子元素:
    //student[student]

Xpath表达式非常强大。例如,您也可以获取没有student祖先节点的任何student

//student[not(ancestor::student)]