使用 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(复数)包装标签中,这是根元素。当然,你的实际情况可能不同,但应该很容易适应。
我正在尝试学习如何将 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(复数)包装标签中,这是根元素。当然,你的实际情况可能不同,但应该很容易适应。