【问题标题】:Parse through XML childs通过 XML 子项解析
【发布时间】:2015-08-21 15:43:54
【问题描述】:

我有以下 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 category1、category2 或 category3 确实存在并且不是空字符串?如果我想要以下输出,循环会是什么样子:

//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>

在上面的例子中,如何检查 category2 是否存在?

感谢你的努力!

【问题讨论】:

    标签: php xml xml-parsing


    【解决方案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 一样简单...

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2013-02-02
      相关资源
      最近更新 更多