php-从文件夹获取xml文件,遍历并获取内容

时间:2018-09-30 11:42:15

标签: php xml dom foreach

我正在尝试从一个文件夹中获取所有xml文件,这与我在SO here上找到的这段代码可以很好地工作:

$files = glob("folder/*xml");    
if (is_array($files)) {   
    foreach($files as $filename) {
        $xml_file = file_get_contents($filename, FILE_TEXT);
        // and proceed with your code
    }
}

现在我正试图从每个xml文件中获取多个内容。

通过在“ //之后继续使用您的代码”部分

echo $xml_file.'<br /><br />';

我了解了每个文件的全部内容。

但是我只想检索几个元素和属性。

我正在使用的xml文件是基于openimmo的。这些xml文件的结构如下所示(摘录):

<openimmo>
    <anbieter>
        <anbieternr>12345</anbieternr>
        <firma>company name</firma>
        <immobilie>
            <objektkategorie>
                <objektart>
                    <haus haustyp="DOPPELHAUSHAELFTE"/>
                </objektart>
            </objektkategorie>
            <geo>
                <plz>12345</plz>
            </geo>
        </immobilie>
    </anbieter>
</openimmo>

我使用另一个脚本,其中解析了一个xml文件,我可以像这样检索它的内容:

echo 'Zip-Code: '.$user->immobilie->geo->plz.'<br />';

但是如何通过遍历给定文件夹的每个文件来获取诸如geo->plz"之类的元素或诸如<haus haustyp="DOPPELHAUSHAELFTE"/>之类的属性的不同内容?

2 个答案:

答案 0 :(得分:1)

您可以做的是将所有xml文件转换为数组。因此,您可以拥有所有值的多维数组,然后可以对它们进行爬网并获得所需的内容:

foreach($files as $filename) {
        $xml_file = file_get_contents($filename, FILE_TEXT);      
        $xml = simplexml_load_string($xml_file, "SimpleXMLElement", LIBXML_NOCDATA);
        $json = json_encode($xml);
        $arr = json_decode($json,TRUE);
     }

答案 1 :(得分:1)

您可以使用DOMDocument类将xml解析为DOM。也可以使用getElementsByTagName()根据名称选择元素,并使用nodeValue获取元素的文本并使用getAttribute()获取属性值。

$doc = new DOMDocument();
$doc->loadXML($xml_file);
$nodeVal = $doc->getElementsByTagName("geo")->item(0)->nodeValue;
// return 12345
$nodeAttr = $doc->getElementsByTagName("haus")->item(0)->getAttribute("haustyp");
// return DOPPELHAUSHAELFTE

因此您的代码应更改为

$doc = new DOMDocument();
foreach($files as $filename) {
    $xml_file = file_get_contents($filename, FILE_TEXT);
    $doc->loadXML($xml_file);
    $nodeVal = $doc->getElementsByTagName("geo")->item(0)->nodeValue;
    $nodeAttr = $doc->getElementsByTagName("haus")->item(0)->getAttribute("haustyp");
}