2013-06-19 12 views
0

我想確定爲什麼它無法獲取XML文件中節點的值。我使用下面的PHP代碼解析我的XML文件...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> 

$數據的顯示的var_dump以下。 ..

陣列(1){[ 「部分號碼」] =>串(0) 「」}

有沒有被報告的錯誤。

可能有人指着我失蹤的方向嗎?

+0

這是你的整個XML還是它的一小部分?也許你可以使用其他PHP XML操作庫以更簡單的方式完成這項工作。 –

回答

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; 
    } 
} 

?> 
0

如果XML文檔不是很大,爲什麼不使用SimpleXMLElementsimplexml_load_string()甚至DOMDocument->loadXML()。並使用XPath查詢來獲取您想要的任何節點。當您處理的文件不應該被預加載,而是依次讀取時,應該使用XMLReader

0

使用simplexmlxpath檢索值:

$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

1

如果你預訂使用(因爲有真正大的XML文件的EG)的XMLReader我通常建議使用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單部分號元素

這個例子也表明,仍然是XML閱讀器,因此您可以在foreach內用它做的一切,以及,也有其他迭代器,讓你查詢的元素,atttributes甚至奔跑淺XPath查詢。

上次我認爲,圖書館是:

如果你不想使用整個圖書館,你會發現XMLReaderNode::readString() method這也顯示瞭如何裏面的代碼獲得向後兼容的值,這使得您的代碼更具互操作性,這是該庫的一個優點。另請參閱XMLReader::readString()