如何使用PHP获取一个文件夹中多个xml文件的元素计数?

rks48beu  于 2023-02-11  发布在  PHP
关注(0)|答案(2)|浏览(134)

下面的php脚本给出了文件夹uploads中单个xml文件的元素计数。但是我在文件夹中有很多xml文件。在下面的脚本中修改什么,以便我得到表格格式的结果,其中包含文件名和文件夹中所有xml文件的元素计数。

<?php
$doc = new DOMDocument;
$xml = simplexml_load_file("uploads/test.xml");
//file to SimpleXMLElement 
$xml = simplexml_import_dom($xml);
print("Number of elements: ".$xml->count());    
?>
vmdwslir

vmdwslir1#

首先将XML文件加载到SimpleXMLElement中,然后将其导入到DOMElement中,并在其上调用方法count()。此方法不存在于DOMElement中,而只存在于SimpleXMLElement中。因此,导入是不必要的。
您可以使用GlobIterator来迭代文件:

$directory = __DIR__.'/uploads';

// get an iterator for the XML files
$files = new GlobIterator(
  $directory.'/*.xml', FilesystemIterator::CURRENT_AS_FILEINFO
);

$results = [];
foreach ($files as $file) {
  // load file using absolute file path 
  // the returned SimpleXMLElement wraps the document element node
  $documentElement = simplexml_load_file($file->getRealPath());
  $results[] = [
    // file name without path
    'file' => $file->getFilename(),
    // "SimpleXMLElement::count()" returns the number of children of an element
    'item-count' => $documentElement->count(),
  ];
}

var_dump($results);

通过DOM,您可以使用Xpath从XML中获取特定的值。

$directory = __DIR__.'/uploads';

// get an iterator for the XML files
$files = new GlobIterator(
  $directory.'/*.xml', FilesystemIterator::CURRENT_AS_FILEINFO
);

// only one document instance is needed
$document = new DOMDocument();

$results = [];
foreach ($files as $file) {
  // load the file into the DOM document
  $document->load($file->getRealPath());
  // create an Xpath processor for the loaded document
  $xpath = new DOMXpath($document);
  $results[] = [
    'file' => $file->getFilename(),
    // use an Xpath expression to fetch the value
    'item-count' => $xpath->evaluate('count(/*/*)'),
  ];
}

var_dump($results);

Xpath表达式

  • 获取文档元素/*
  • 获取文档元素/*/*的子元素
  • 数一数count(/*/*)

*是任何元素节点的通用选择器。如果可以,您应该更具体地使用实际的元素名称(例如/list/item)。

xxb16uws

xxb16uws2#

首先,使用下面的逻辑创建一个function

function getXML($path) {
    $doc = new DOMDocument;
    $xml = simplexml_load_file($path);
    //file to SimpleXMLElement 
    $xml = simplexml_import_dom($xml);
    return $xml;
}

请注意,我:

  • 我已经将路径转换为参数,因此您可以对文件重用相同的逻辑
  • 我把XML的解析和显示分开了
  • 我返回了XML本身,因此您可以获得计数,也可以对它执行任何其他操作

这就是你如何获得给定路径的文件:

$files = array_diff(scandir('uploads'), array('.', '..'));

我们得到了除...之外的所有文件,这两个文件肯定不是我们感兴趣的。https://www.php.net/manual/en/function.scandir.php
成功时您收到了一个文件名数组,因此,让我们循环它并执行所需的逻辑:

$xmls = [];
foreach ($files as $file) {
    if (str_ends_with($file, '.xml')) {
        $xmls[] = $file . "\t" . getXML('uploads/' . $file)->count();
    }
}
echo implode("\n", $xmls);

编辑
正如@Juan在评论区善意地解释的那样,人们可以使用

$files = glob("./uploads/*.xml");

而不是scandir,这将确保我们不再需要调用array_diff,以后我们可以避免在循环中使用if

$xmls = [];
foreach ($files as $file) {
    $xmls[] = $file . "\t" . getXML('uploads/' . $file)->count();
}
echo implode("\n", $xmls);

相关问题