【问题标题】:How to get inner text in a xml tag array in php如何在php中的xml标签数组中获取内部文本
【发布时间】:2013-01-24 15:11:03
【问题描述】:

所以我有一个这样的 xml:

<cars> 
    <brand name="Audi"> 
        <model>A1</model> 
        <model>A3</model>
        <model>A5</model> 
    </brand> 
    <brand name="Ferrari"> 
        <model>F12</model>
        <model>FF</model> 
    </brand> 
</cars>

我想要的是将其转换为: $cars['Audi'][0]['A1'] 等等,但我不知道如何将内部文本放入标签中(例如:F12)。顺便说一下,我正在尝试使用 simplexml!

所以,现在我正在这样做:

$doc = new SimpleXmlElement($xml, LIBXML_DTDLOAD); 
$brands = $doc->xpath('//brand[@model="Audi"]');
$model_1 = $brands[0]->model[0];

当然什么也没发生……

【问题讨论】:

  • 向我们展示您的尝试

标签: php xml arrays xpath simplexml


【解决方案1】:
<?php
$xml = '<cars> 
            <brand name="Audi"> 
                <model>A1</model> 
                <model>A3</model>
                <model>A5</model> 
            </brand> 
            <brand name="Ferrari"> 
                <model>F12</model>
                <model>FF</model> 
            </brand> 
        </cars>';

$doc = simplexml_load_string($xml);

foreach ($doc->children() as $brand) {
    foreach ($brand->children() as $model) {
        $cars[(string)$brand->attributes()->name][] = (string)$model;
    }
}

echo '<pre>';
print_r($cars);
echo '</pre>';
?>

【讨论】:

    【解决方案2】:

    试试这个:

    //cars/brand[@name="Audi"]/*[1]
    

    你的错误:

    1. 属性匹配应该是@name="Audi"
    2. *[1] 是第一个子节点

    例子

    $models = $doc->xpath('//cars/brand[@name="Audi"]/*[1]');
    var_dump((string)current($models));
    

    【讨论】:

      【解决方案3】:
      <cars> 
          <brand name="Audi"> 
              <model>A1</model> 
              <model>A3</model>
              <model>A5</model> 
          </brand> 
      </cars>
      

      $cars = simplexml_load_file("cars.xml"); // root tag cars
      // echo $cars->brand[0]['name'];
      foreach ($cars->brand[0]->model as $model) {
      echo $model;
      }
      

      我让这个例子更酷:

      <?php
      echo "<head><style>html,body{padding:0;margin:0;background-color:black;text-align:center;}.ul{border-bottom:10px dashed #555555;width:50%;margin-left:25%;margin-right:25%;list-style-type:none;box-shadow:0px 0px 2px gold;}.li{font-size:100px;background-color:silver;color:white;font-family:arial;text-shadow:1px 1px black;}.li:nth-child(even){background-color:yellow;}</style></head><body>";
      
      $cars = simplexml_load_file("cars.xml"); // root tag cars
      // echo $cars->brand[0]['name'];
      
      foreach($cars->brand as $brand) {
        echo "<div class='ul'>";
        foreach($brand->model as $model) {
          echo "<div class='li'>";
          echo $model;
          echo "</div>";
        }
        echo "</div>";
      }
      
      echo "</body>";
      

      【讨论】:

      • 我当时的回答是什么:D?
      【解决方案4】:

      好的,所以诀窍是在迭代时将标签转换为字符串,当然还要迭代它!

      (字符串)$模型;

      就是这样!我认为它是空的,因为当我检查它时调试器没有返回任何东西。

      您的所有问题都解决了,非常感谢!

      【讨论】:

      • 尝试使用var_dump 来检查输出。它返回 object(SimpleXMLElement) 而不是空的。前面的(string) 将其转换为普通字符串。
      猜你喜欢
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 2012-12-03
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多