用PHP读取XML文件,XML文件未组织

时间:2019-05-21 12:34:35

标签: php xml xml-parsing

大家好,我有一个这样的XML文件:

<?xml version="1.0"?>
<catalog>
   <car>
      <title>This is car</title>
      <price>44.95</price>
      <model>2018</model>
      <description>An in-depth look at creating applications with XML.</description>
   </car>

   <bike>
      <title>this is bike</title>
      <price>33.58</price>
      <description>Just the dummy description</description>
   </bike>
   <wheels>
      <title>this is wheel</title>
      <price>33.58</price>
      <description>Just the dummy description</description>
   </wheels>

   <bike>
      <title>this is bike</title>
      <price>33.58</price>
      <description>Just the dummy description</description>
   </bike>


</catalog>

我想遍历节点并相应地处理节点。如果是汽车,则需要将汽车详细信息传递给某些功能;如果是自行车,则需要将自行车详细信息传递给其他功能。

重点是根据节点类型(汽车,自行车或其他)处理节点。

PHP

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

$doc = new DOMDocument;

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

// now that we're at the right depth, hop to the next <product/> until the end of the tree
while ($z->name === 'product')
{
    // either one should work
    //$node = new SimpleXMLElement($z->readOuterXML());
    $node = simplexml_import_dom($doc->importNode($z->expand(), true));

    // now you can use $node without going insane about parsing
    var_dump($node->element_1);

    // go to next <product />
    $z->next('product');
}

如果节点是产品,则上述PHP代码可以正常工作。我需要使用不同的节点。

1 个答案:

答案 0 :(得分:1)

您可以仅使用SimpleXML来做到这一点:

$xml = simplexml_load_file('data.xml');
foreach ($xml->children() as $product) {
    if ($product->getName() == 'car') {
        carFunc($product->title, $product->price, $product->model, $product->description);
    }
    if ($product->getName() == 'bike') {
        bikeFunc($product->title, $product->price, $product->description);
    }
    if ($product->getName() == 'wheels') {
        wheelFunc($product->title, $product->price, $product->description);
    }
}

function carFunc($title, $price, $model, $description) {
    echo "Car: $title: It's a $model selling for $price. In detail: $description\n";
}

function bikeFunc($title, $price, $description) {
    echo "Bike: $title: It sells for $price. In detail: $description\n";
}

function wheelFunc($title, $price, $description) {
    echo "Wheel: $title: It sells for $price. In detail: $description\n";
}

输出(用于示例XML)

Car: This is car: It's a 2018 selling for 44.95. In detail: An in-depth look at creating applications with XML. 
Bike: this is bike: It sells for 33.58. In detail: Just the dummy description 
Wheel: this is wheel: It sells for 33.58. In detail: Just the dummy description 
Bike: this is bike: It sells for 33.58. In detail: Just the dummy description

Demo on 3v4l.org