我正在尝试确定为什么我无法在XML文件中获取节点的值。我正在使用以下PHP代码来解析我的XML文件......
<?php
error_reporting(E_ALL);
ini_set( 'display_errors','1');
libxml_use_internal_errors(true);
libxml_clear_errors();
// create the reader object
$reader = new XMLReader();
// reader the XML file.
$reader->open('test.xml');
// start reading the XML File.
while($reader->read()) {
// take action based on the kind of node returned
switch($reader->nodeType) {
// read more http://uk.php.net/manual/en/class.xmlreader.php#xmlreader.constants.element
case (XMLREADER::ELEMENT):
// get the name of the node.
$node_name = $reader->name;
// move the pointer to read the next item
$reader->read();
// action based on the $node_name
if ($node_name == 'PartNumber') {
$reader->read();
$data['PartNumber'] = $reader->value;
var_dump($data);
};
break;
case (XMLREADER::END_ELEMENT):
// do something based on when the element closes.
break;
}
}
?>
我的XML数据示例如下......
<Items>
<Item MaintenanceType="C">
<HazardousMaterialCode>N</HazardousMaterialCode>
<ItemLevelGTIN GTINQualifier="UP">090127000380</ItemLevelGTIN>
<PartNumber>0-1848-1</PartNumber>
<BrandAAIAID>BBVL</BrandAAIAID>
<BrandLabel>Holley</BrandLabel>
<PartTerminologyID>5904</PartTerminologyID>
<Descriptions>
<Description MaintenanceType="C" DescriptionCode="DES" LanguageCode="EN">Street Carburetor</Description>
<Description MaintenanceType="C" DescriptionCode="SHO" LanguageCode="EN">Crb</Description>
</Descriptions>
<Prices>
<Pricing MaintenanceType="C" PriceType="JBR">
<PriceSheetNumber>L30779-13</PriceSheetNumber>
<CurrencyCode>USD</CurrencyCode>
<EffectiveDate>2013-01-01</EffectiveDate>
<Price UOM="PE">462.4600</Price>
</Pricing>
<Pricing MaintenanceType="C" PriceType="RET">
<PriceSheetNumber>L30779-13</PriceSheetNumber>
<CurrencyCode>USD</CurrencyCode>
<EffectiveDate>2013-01-01</EffectiveDate>
<Price UOM="PE">380.5500</Price>
</Pricing>
<Pricing MaintenanceType="C" PriceType="WD1">
<PriceSheetNumber>L30779-13</PriceSheetNumber>
<CurrencyCode>USD</CurrencyCode>
<EffectiveDate>2013-01-01</EffectiveDate>
<Price UOM="PE">314.4700</Price>
</Pricing>
</Prices>
<ExtendedInformation>
<ExtendedProductInformation MaintenanceType="C" EXPICode="CTO" LanguageCode="EN">US</ExtendedProductInformation>
<ExtendedProductInformation MaintenanceType="C" EXPICode="NPC" LanguageCode="EN">A</ExtendedProductInformation>
<ExtendedProductInformation MaintenanceType="C" EXPICode="HTS" LanguageCode="EN">8409914000</ExtendedProductInformation>
<ExtendedProductInformation MaintenanceType="C" EXPICode="NAF" LanguageCode="EN">B</ExtendedProductInformation>
</ExtendedInformation>
<ProductAttributes>
<ProductAttribute MaintenanceType="C" AttributeID="SKU" LanguageCode="EN">BBVL0-1848-1</ProductAttribute>
<ProductAttribute MaintenanceType="C" AttributeID="ModDate" LanguageCode="EN">2012-12-31</ProductAttribute>
</ProductAttributes>
<Packages>
<Package MaintenanceType="C">
<PackageLevelGTIN>00090127000380</PackageLevelGTIN>
<PackageUOM>EA</PackageUOM>
<QuantityofEaches>1</QuantityofEaches>
<Dimensions UOM="IN">
<Height>7.5000</Height>
<Width>11.0000</Width>
<Length>12.2500</Length>
</Dimensions>
<Weights UOM="PG">
<Weight>13.500</Weight>
<DimensionalWeight>6.09</DimensionalWeight>
</Weights>
</Package>
</Packages>
</Item>
</Items>
$ data的var_dump显示以下内容......
array(1){[“PartNumber”] =&gt; string(0)“”}
没有报告错误。
有人能指出我想要的方向吗?
答案 0 :(得分:1)
如果你预定使用XMLReader(例如因为有非常大的XML文件),我通常会建议使用a library called XMLReaderIterator
,这样你就可以专注于解析数据,而不是阅读XML。对于您的示例代码,这只是一些小代码:
require('xmlreader-iterators.php'); // https://github.com/hakre/XMLReaderIterator/tree/master/build/include
$xmlFile = "xmlreader-17187636.xml";
$reader = new XMLReader();
$reader->open($xmlFile);
/* @var $partNumbers XMLReaderNode[] */
$partNumbers = new XMLElementIterator($reader, 'PartNumber');
foreach($partNumbers as $partNumber) {
echo " * ", $partNumber->readString(), "\n";
}
这显示了如何使用XMLElementIterator
迭代所有名为 PartNumber
的元素,然后读取其字符串值。此示例中的输出为:
* 0-1848-1
因为您在XML中有一个 part-number元素。
该示例还显示仍然存在XML阅读器,因此您可以在foreach中执行所有操作,还有其他迭代器,它们允许您查询元素,引用甚至运行浅xpath查询。
上次我建议图书馆在:
如果你不想使用整个库,你会发现XMLReaderNode::readString()
method里面的代码,它也显示了如何使值向后兼容,这使得你的代码更加可互操作,这是一个好处那个图书馆。另见XMLReader::readString()。
答案 1 :(得分:0)
您忘了定义$data = array();
<?php
error_reporting(E_ALL);
ini_set( 'display_errors','1');
libxml_use_internal_errors(true);
libxml_clear_errors();
$data = array(); //notice this???
// create the reader object
$reader = new XMLReader();
// reader the XML file.
$reader->open('test.xml');
// start reading the XML File.
while($reader->read()) {
// take action based on the kind of node returned
switch($reader->nodeType) {
// read more http://uk.php.net/manual/en/class.xmlreader.php#xmlreader.constants.element
case (XMLREADER::ELEMENT):
// get the name of the node.
$node_name = $reader->name;
// move the pointer to read the next item
$reader->read();
// action based on the $node_name
if ($node_name == 'PartNumber') {
$reader->read();
$data['PartNumber'] = $reader->value;
var_dump($data);
};
break;
case (XMLREADER::END_ELEMENT):
// do something based on when the element closes.
break;
}
}
?>
答案 2 :(得分:0)
如果XML文档不是很大,为什么不使用SimpleXMLElement
的{{1}}甚至simplexml_load_string()
的{{1}}。并对它们使用XPath
查询以获取所需的任何节点。处理非常大的文件时,应使用DOMDocument
,这些文件不应预先加载,而是按顺序读取。
答案 3 :(得分:0)
使用simplexml
和xpath
来检索值:
$xml = simplexml_load_string($x); // assume XML in $x
$pns = $xml->xpath("//PartNumber");
现在,$pns
包含所有<PartNumber>
值的数组。
要仅检索第一个<PartNumber>
,请执行:
$pn = $xml->xpath("//PartNumber")[0]; // with PHP >= 5.4
看到它正常工作:http://3v4l.org/I7eKQ