Php 通过XML儿童解析

Php 通过XML儿童解析,php,xml,xml-parsing,Php,Xml,Xml Parsing,我有以下xml: <?xml version="1.0" standalone="yes"?> <Products> <Product> <name>Milk</name> <price>1.4</price> <productinfos> <category1 value="somecategory1"/> <category2 value="someca

我有以下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 version="1.0" standalone="yes"?>
<Products>
 <Product>
  <name>Milk</name>
  <price>1.4</price>
  <productinfos>
   <category1 value=""/>
   <category3 value="somecategory"/>
  </productinfos>
 </Product>
</Products>

牛奶
1.4
在上面的示例中,如何检查category2是否存在?


谢谢你的努力

您正在寻找
simplexmlement::children()
方法

$xml=新的SimpleXMLElement(true,
“category2'=>正确,
“类别3”=>正确,
);
//遍历的子标记
foreach($product->productinfos->children()作为$productinfo){
//使用getName()方法访问元素名,然后
//XML属性可以像数组一样访问
if(isset($missing_tags[$productinfo->getName()]))&&
!空($productinfo['value'])){
$missing_标记[$productinfo->getName()]=false;
echo$productinfo->getName()。“:”$productinfo['value']。“\n”;
}
}
//带有一个参数的数组_过滤器会过滤掉任何计算为false的值
if(数组\过滤器($缺少\标记)){
echo“缺少标记:”.infrade(“,”,数组_键($Missing_标记))。“\n”;
}
}
SimpleXML扩展的直观性不如它的名字所暗示的那样好,但它的简单程度与使用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>
$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";
    }
}