2017-06-06 98 views
0

我们已经有了这种格式的XML文件:访问元素含量和用SimpleXML解析命名空间属性

<Quiz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <id>0</id> 
    <title>Ganz Anderer Titel</title> 
    <questions> 
    <Question xsi:type="ChoiceQuestion"> 
     <title>Frage1</title> 
     <id>0</id> 
     <rightAnswer>1</rightAnswer> 
    </Question> 
    <Question xsi:type="ChoiceQuestion"> 
     <title>Frage2</title> 
     <id>1</id> 
     <rightAnswer>2</rightAnswer> 
    </Question> 
    <Question xsi:type="ChoiceQuestion"> 
     <title>Frage2</title> 
     <id>2</id> 
     <rightAnswer>3</rightAnswer> 
    </Question> 
    </questions> 
    <expireDate>2018-06-06T00:00:00</expireDate> 
</Quiz> 

现在,我们需要解析这个XML文件,但我们不能够接入内容或属性的问题元素。

我们正在使用PHP 7内置SimpleXML中的解析器。

echo json_encode($xml->questions); 

显示此

{"Question":[{"title":"Frage1","id":"0","rightAnswer":"1"},{"title":"Frage2","id":"1","rightAnswer":"2"},{"title":"Frage2","id":"2","rightAnswer":"3"}]} 

,但我们不知道如何让每一个问题的数据分别。

+1

用一个简单的foreach。 –

+0

尝试一个简单的'print_r($ xml-> questions)'应该显示你的数据结构 – RiggsFolly

+0

谢谢。 print_r帮了很大忙。任何想法如何获得每个问题的xsi属性? –

回答

0

正如评论所说,一个简单的foreach循环将让你遍历列表中的每个项目。要获得命名空间的属性,使用SimpleXMLElement::attributes()方法:

$xml = <<< XML 
<Quiz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <id>0</id> 
    <title>Ganz Anderer Titel</title> 
    <questions> 
    <Question xsi:type="ChoiceQuestion"> 
     <title>Frage1</title> 
     <id>0</id> 
     <rightAnswer>1</rightAnswer> 
    </Question> 
    <Question xsi:type="ChoiceQuestion"> 
     <title>Frage2</title> 
     <id>1</id> 
     <rightAnswer>2</rightAnswer> 
    </Question> 
    <Question xsi:type="ChoiceQuestion"> 
     <title>Frage2</title> 
     <id>2</id> 
     <rightAnswer>3</rightAnswer> 
    </Question> 
    </questions> 
    <expireDate>2018-06-06T00:00:00</expireDate> 
</Quiz> 
XML; 

$x = new SimpleXMLElement($xml); 
foreach ($x->questions->Question as $q) { 
    printf(
     "Question %d:\nType:%s\nTitle:%s\nRight answer:%s\n", 
     $q->id, 
     $q->attributes("xsi", true)->type, 
     $q->title, 
     $q->rightAnswer 
    ); 
}