0

我试图确定为什么我无法在我的 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 显示以下内容...

数组(1){[“零件号”]=>字符串(0)“”}

没有报告错误。

有人可以指出我所缺少的方向吗?

4

4 回答 4

1

如果您预定使用 XMLReader(例如因为有非常大的 XML 文件),我通常建议使用一个名为的库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";
}

这显示了如何使用 anXMLElementIterator遍历所有命名的元素PartNumber,然后读取它们的字符串值。此示例中的输出为:

 * 0-1848-1

因为您在 XML 中有一个零件编号元素。

该示例还显示仍然存在 XML 阅读器,因此您可以在 foreach 中使用它来完成所有操作,并且还有其他迭代器允许您查询元素、属性,甚至运行浅 xpath 查询。

上次我建议图书馆在:

如果您不想使用整个库,您可以在XMLReaderNode::readString()方法中找到代码,该代码还显示了如何获得向后兼容的值,这使您的代码更具互操作性,这是该库的一个好处。另请参见XMLReader::readString()

于 2013-06-20T08:36:20.173 回答
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;
   }
}

?>
于 2013-06-19T09:36:31.340 回答
0

使用simplexmlandxpath检索值:

$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

于 2013-06-19T16:45:29.397 回答
0

如果 XML 文档不是很大,为什么不使用SimpleXMLElement'ssimplexml_load_string()甚至DOMDocument's ->loadXML()。并使用XPath对它们的查询来获取您想要的任何节点。当XMLReader您处理不应预加载但应按顺序读取的非常大的文件时,应使用 。

于 2013-06-19T09:43:29.547 回答