2015-08-21 84 views
-1

我有以下XML:解析通過XML童車

<?xml version="1.0" standalone="yes"?> 
<Products> 
<Product> 
    <name>Milk</name> 
    <price>1.4</price> 
    <productinfos> 
    <category1 value="somecategory1"/> 
    <category2 value="somecategory2"/> 
    <category3 value="somecategory3"/> 
    </productinfos> 
</Product> 
</Products> 

我怎樣才能確保productinfos類別1,類別2或類別3確實存在,不是一個空字符串?又是如何循環的樣子,如果我想以下的輸出:

//output 
Cat1: somecategory1 
Cat3: somecategory3 
Cat2: somecategory2 

因爲有時我解析XML看起來不同:

<?xml version="1.0" standalone="yes"?> 
<Products> 
<Product> 
    <name>Milk</name> 
    <price>1.4</price> 
    <productinfos> 
    <category1 value=""/> 
    <category3 value="somecategory"/> 
    </productinfos> 
</Product> 
</Products> 

在上面的例子中,我怎樣才能檢查產品組別存在?

tia爲您的努力!

回答

1

您正在尋找SimpleXMLElement::children()方法。

https://secure.php.net/manual/en/simplexmlelement.children.php

$xml = new SimpleXMLElement(<<<XML 
<?xml version="1.0" standalone="yes"?> 
<Products> 
    <Product> 
     <name>Milk</name> 
     <price>1.4</price> 
     <productinfos> 
      <category1 value="somecategory1"/> 
      <category2 value="somecategory2"/> 
      <category3 value="somecategory3"/> 
     </productinfos> 
    </Product> 
</Products> 
XML 
); 

// $xml is a SimpleXMLElement of <Products> 
foreach ($xml->children() as $product) { 
    if ($product->getName() != 'Product') { 
     // ignore <Products><Cow> or whatever, if you care 
     continue; 
    } 

    // start out assuming that everything is missing 
    $missing_tags = array(
     'category1' => true, 
     'category2' => true, 
     'category3' => true, 
    ); 

    // iterate through child tags of <productinfos> 
    foreach ($product->productinfos->children() as $productinfo) { 
     // element name is accessed using the getName() method, and 
     // XML attributes can be accessed like an array 
     if (isset($missing_tags[$productinfo->getName()]) && 
       !empty($productinfo['value'])) { 
      $missing_tags[$productinfo->getName()] = false; 
      echo $productinfo->getName() . ": " . $productinfo['value'] . "\n"; 
     } 
    } 

    // array_filter with one argument filters out any values that eval to false 
    if (array_filter($missing_tags)) { 
     echo "Missing tags: " . implode(", ", array_keys($missing_tags)) . "\n"; 
    } 
} 

SimpleXML擴展比名字所顯示的,而不太直觀,但它是你可以使用XML得到一樣簡單......

+0

十分感謝!爲我工作得很好! – d4ny3l