使用 XMLReader 和 SimpleXML 从具有特定参数名称的属性中检索数据

Using XMLReader and SimpleXML to retrieve data from an atrribute with a specific parameter name

我正在尝试学习如何将 XMLReader 与 SimpleXML 结合使用来读取大型 xml 文件并能够从中检索各种数据。我的问题是通过元素的属性从元素中检索数据。

例如,如果我有 XML:

<Product>
    <CustomParameter Name="companyName">Company A</CustomParameter>
    <CustomParameter Name="productName">Shiny Black Shoes</CustomParameter>
    <CustomParameter Name="productUrl">http://www.example.com</CustomParameter>
    <CustomParameter Name="companyUrl">http://www.example.com</CustomParameter>
</Product>
<Product>
    <CustomParameter Name="companyName">Company B</CustomParameter>
    <CustomParameter Name="productName">Boots</CustomParameter>
    <CustomParameter Name="productUrl">http://www.example.com</CustomParameter>
    <CustomParameter Name="companyUrl">http://www.example.com</CustomParameter>
</Product>

我只想检索具有 name="productName" 属性的 CustomParameter 的数据。

我正在使用这段代码,但它只显示第一个找到的 CustomParameter。

$z = new XMLReader;
$z->open('products.xml');

$doc = new DOMDocument;

$product_name = array();

// move to the first <product /> node
while ($z->read() && $z->name !== 'Product');

while ($z->name === 'Product')
{
    $node = simplexml_import_dom($doc->importNode($z->expand(), true));

    $product_name[] = $node->CustomParameter;

    $z->next('Product');
 }

 $product_name = array_unique($product_name);

foreach($product_name as $value)
     echo $value."\n";

谁能解释一下如何阅读我想要的具体内容?

谢谢

在产品 while 循环中,您可以遍历每个 CustomParameter 标签,测试属性值,如下所示:

while ($z->name === 'Product')
{
    $node = simplexml_import_dom($doc->importNode($z->expand(), true));

    foreach($node->children() as $child) {
        if ($child["Name"] == "productName") {
            $product_name[] = (string) $child;
        }
    }

    $z->next('Product');
}

但是,如果您使用 xpath 搜索,您可以使代码更短,如下所示:

$xmlDoc = simplexml_load_file('products.xml');

// locate the nodes of interest through an XPath descriptor:
$result = $xmlDoc->xpath('/Products/Product/CustomParameter[@Name="productName"]');

while(list( , $node) = each($result)) {
    $product_name[] = (string) $node;
}

在上面的代码中,您应该将 XPath 值替换为元素的真实路径。由于您没有提供整个 XML 文档,我只是假设 Product 标签出现在 Products(复数)包装标签中,这是根元素。当然,你的实际情况可能不同,但应该很容易适应。